string转charsequence - CharSequence和String在java中的确切区别




string详解 to (8)

CharSequence的Java API:

CharSequence是一个可读的字符序列。 该接口为许多不同类型的字符序列提供统一的只读访问。

此接口然后由StringCharBufferStringBuffer以保持所有方法名称的一致性。

我读过这篇以前的文章 。 任何人都可以说出CharSequence和String之间的确切区别是什么,除了String实现CharSequence并且String是一系列字符之外呢? 例如:

CharSequence obj = "hello";
String str = "hello";
System.out.println("output is : " + obj + "  " + str);

当“hello”分配给obj并再次分配给str时会发生什么?


除了String实现CharSequence并且String是一个字符序列的事实之外。

你的代码中发生了几件事情:

CharSequence obj = "hello";

这会创建一个String "hello" ,它是一个String对象。 作为一个实现CharSequenceString ,它也是一个CharSequence 。 (你可以阅读这篇关于编码接口的文章)。

下一行:

String str = "hello";

稍微复杂一点。 Java中的String文本保存在一个池中(因此),因此此行上的"hello"与第一行中的"hello"是同一个对象(标识)。 因此,该行只将相同的String文字分配给str

此时, objstr都是对String文字"hello"引用,因此它们是equals== ,它们都是一个String和一个CharSequence

我建议你测试这个代码,在行动中展示我刚刚写的内容:

public static void main(String[] args) {
    CharSequence obj = "hello";
    String str = "hello";
    System.out.println("Type of obj: " + obj.getClass().getSimpleName());
    System.out.println("Type of str: " + str.getClass().getSimpleName());
    System.out.println("Value of obj: " + obj);
    System.out.println("Value of str: " + str);
    System.out.println("Is obj a String? " + (obj instanceof String));
    System.out.println("Is obj a CharSequence? " + (obj instanceof CharSequence));
    System.out.println("Is str a String? " + (str instanceof String));
    System.out.println("Is str a CharSequence? " + (str instanceof CharSequence));
    System.out.println("Is \"hello\" a String? " + ("hello" instanceof String));
    System.out.println("Is \"hello\" a CharSequence? " + ("hello" instanceof CharSequence));
    System.out.println("str.equals(obj)? " + str.equals(obj));
    System.out.println("(str == obj)? " + (str == obj));
}

在charSequence中,你没有可用于String的非常有用的方法。 如果您不想查看文档,请键入:obj。 和str。

并查看您的编译器为您提供的方法。 这对我来说是最基本的区别。


我知道它是一种明显的,但CharSequence是一个接口,而String是一个具体的类:)

java.lang.String是这个接口的实现...


一般差异

除了String之外,还有几个实现CharSequence接口的类。 其中包括

  • StringBuilder用于可修改的可变长度字符序列
  • CharBuffer用于可以修改的固定长度低级字符序列

任何接受CharSequence都可以对所有这些方法同样适用。 任何只接受String都需要转换。 所以在所有你不关心内部的地方使用CharSequence作为参数类型是谨慎的。 但是,如果实际返回String ,则应该使用String作为返回类型,因为如果调用方法确实需要String则可避免可能的返回值转换。

还要注意地图应该使用String作为键类型,而不是CharSequence ,因为地图键不能改变。 换句话说,有时String的不可变性质至关重要。

特定的代码片段

至于你粘贴的代码:简单地编译一下,然后使用javap -v查看JVM字节码。 在那里你会注意到objstr都是对同一个常量对象的引用。 由于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)通过一个方法调用可能会更有效率。


考虑UTF-8。 在UTF-8中,Unicode代码点由一个或多个字节构成。 封装UTF-8字节数组的类可以实现CharSequence接口,但最重要的是不是String。 当然,你不能传递一个UTF-8字节数组,当你想要一个字符串时,但你肯定可以传递一个UTF-8包装类来实现CharSequence,当合同放松以允许一个CharSequence时。 在我的项目中,我正在开发一个名为CBTF8Field(压缩二进制传输格式 - 八位)的类来为xml提供数据压缩,并且正在寻找使用CharSequence接口来实现从CBTF8字节数组到字符数组的转换(UTF-16 )和字节数组(UTF-8)。

我来这里的原因是为了全面了解后续合同。


CharSequence是一个契约( interface ), String是这个契约的一个implementation

public final class String extends Object 
    implements Serializable, Comparable<String>, CharSequence

CharSequenceCharSequence是:

CharSequence是一个可读的char值序列。 该接口为许多不同类型的字符序列提供统一的只读访问。 char值代表基本多语言平面(BMP)或替代品中的字符。 详情请参阅Unicode字符表示。


int foo=Integer.parseInt("1234");

确保字符串中没有非数字数据。







java string charsequence