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




string to charsequence (6)

我读过这篇以前的文章 。 任何人都可以说出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));
}

TL;博士

一个是接口( CharSequence ),而另一个是该接口的具体实现( String )。

CharSequence animal = "cat"  // `String` object presented as the interface `CharSequence`.

作为一个接口, CharSequence通常比String更常见,但是一些扭曲的历史导致接口在实现几年后被定义。 所以在较旧的API中,我们经常看到String而在较新的API中,我们倾向于看到CharSequence用于定义参数和返回类型。

细节

现在我们知道,通常API /框架应该主要侧重于主要导出接口和次要的具体类。 但是我们并不总是很清楚这一课。

String类首先在Java中出现。 后来他们才放置了一个前置界面CharSequence

扭曲的历史

有点历史可能有助于理解。

在成立初期,由于互联网/网络躁狂促成了该行业的动态化,因此Java在市场上有所提前赶到市场。 一些图书馆并没有像他们应有的那样深思熟虑。 字符串处理是其中的一个领域。

此外,Java是最早的面向生产的非学术型面向对象编程(OOP)环境之一。 在此之前,唯一成功的现实世界的橡皮圈实现的OOP是SmallTalk一些有限版本,然后是带有NeXTSTEP / OpenStep Objective-C 。 所以,许多实践经验还有待学习。

Java以String类和StringBuffer类开始。 但是这两个类是不相关的,不是通过继承或者接口彼此相连的。 后来,Java团队认识到,在字符串相关的实现之间应该有一个统一的联系,以使它们可以互换。 在Java 4中,团队添加了CharSequence接口,并追溯地在String和String Buffer上实现了该接口,并添加了另一个实现CharBuffer 。 后来在Java 5中,他们添加了StringBuilder ,基本上是一个非同步的,因此速度更快的StringBuffer版本。

所以这些面向字符串的类有点混乱,有点让人费解。 构建了许多库和接口来接收和返回String对象。 现在这样的库通常应该被构建以期望CharSequence 。 但是(a) String似乎仍然支配着思维空间,并且(b)混合各种CharSequence实现时可能存在一些细微的技术问题。 用20/20的事后回顾,我们可以看到,所有这些字符串的东西本可以更好地处理,但我们在这里。

理想情况下,Java将从一个接口和/或超类开始,它将用于我们现在使用String很多地方,就像我们使用CollectionList接口来代替ArrayListLinkedList实现一样。

界面与类

CharSequence的主要区别在于它是一个interface ,而不是一个implementation 。 这意味着你不能直接实例化一个CharSequence 。 而是实例化一个实现该接口的类。

例如,这里我们有x看起来像CharSequence但下面实际上是一个StringBuilder对象。

CharSequence x = new StringBuilder( "dog" );

使用String文字时这变得不那么明显。 请记住,当你在字符周围看到带有引号的源代码时,编译器将它转换为一个String对象。

CharSequence y = "cat";  // Looks like a CharSequence but is actually a String instance.

这个其他问题中讨论的"cat"new String("cat")之间有一些细微的差别,但在这里无关紧要。

类图

这个类图可能有助于指导你。 我注意到了Java的版本,他们似乎在演示通过这些类和接口搅动了多少变化。


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

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

CharSequenceCharSequence是:

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


CharSequence的Java API:

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

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


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

java.lang.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