CharSequence和java之间的确切区别
作者:互联网
参见英文答案 > CharSequence VS String in Java? 9个
> Why StringBuilder when there is String? 9个
> Choosing between CharSequence and String for an API 1个
我读了这个previous post.可以有人说CharSequence和String之间的确切区别是什么,除了String
实现CharSequence
并且String是一个字符序列的事实?例如:
CharSequence obj = "hello";
String str = "hello";
System.out.println("output is : " + obj + " " + str);
将“hello”分配给obj并再次分配给str时会发生什么?
解决方法:
一般差异
除了String
之外,还有几个类实现CharSequence
接口.其中有
> StringBuilder
用于可修改的可变长度字符序列
> CharBuffer
用于可修改的固定长度低级字符序列
接受CharSequence的任何方法都可以在所有这些方面同样良好地运行.任何只接受String的方法都需要转换.所以在所有你不关心内部的地方使用CharSequence作为参数类型是谨慎的.但是,如果实际返回String,则应该使用String作为返回类型,因为如果调用方法实际上需要String,则可以避免返回值的可能转换.
另请注意,映射应使用String作为键类型,而不是CharSequence,因为映射键不能更改.换句话说,有时String的不可变性质是必不可少的.
具体代码段
至于你粘贴的代码:只需编译它,然后使用javap -v查看JVM字节码.在那里你会注意到obj和str都是对同一个常量对象的引用.由于String是不可变的,这种共享是可以的.
String的运算符被编译为各种StringBuilder.append调用的调用.所以它相当于
System.out.println(
(new StringBuilder())
.append("output is : ")
.append((Object)obj)
.append(" ")
.append(str)
.toString()
)
我必须承认我有点惊讶我的编译器javac 1.6.0_33使用StringBuilder.append(Object)而不是StringBuilder.append(CharSequence)编译obj.前者可能涉及对对象的toString()方法的调用,而后者应该以更有效的方式进行.另一方面,String.toString()只返回String本身,因此没有什么惩罚.因此,通过大约一个方法调用,StringBuilder.append(String)可能更有效.
标签:java,string,charsequence 来源: https://codeday.me/bug/20190917/1809648.html