编程语言
首页 > 编程语言> > CharSequence和java之间的确切区别

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