1.我对这两个东西感到困惑,它们是否有不同的功能?如果是这样,那么它们有什么区别呢?
StringBuffer(CharSequence chars)
并且。
StringBuffer(String str)
2. 字符串和CharSequence之间的基本区别是什么(特别是功能)?
CharSequence
是一个接口,因此您不能直接实例化它。 String
是一个具体的类,它实现了 CharSequence
接口。 StringBuffer
也实现了 CharSequence
接口。
至于为什么 StringBuffer
有两个构造函数,一个接受 String
,另一个接受 CharSequence
,几乎肯定是因为(根据 Javadoc 中的 Since
行),CharSequence
直到 Java v1.4 才被添加,而 StringBuffer
(和 String
)在 Java 1.0 中就存在了。
CharSequence
是一个接口,String
实现了它。
这意味着,例如,当您在String
上调用.charAt()
时,实际上调用的是CharSequence
方法的String
实现。
从CharSequence
的javadoc中可以看出,JDK中并没有很多类实现此接口。
至于为什么会有两个构造函数,StringBuffer
追溯到Java 1.0,而CharSequence
仅出现在1.4中;但是,StringBuilder
(您应该使用它,而不是StringBuffer
)有两个构造函数(一个带有CharSequence
作为参数,另一个带有String
作为参数),因此当传递String
作为参数时可能会有优化。至于这样的优化可能是什么,那就是“使用源代码,卢克”(tm)。
作为一个未在JDK中实现CharSequence
的示例,您可以查看我的一个项目:largetext。请注意,生成Pattern
的Matcher
时使用CharSequence
而不是String
作为参数;由于String
实现了CharSequence
,因此将String
作为参数传递是有效的。
CharSequence
构造函数就足够了,但优化是同时拥有两者的完全正当的理由。 - Louis WassermanString
是一个CharSequence
,我们可以简单地将一个字符串实例传递给期望一个CharSequence
实例的方法。我们之所以拥有这两个是因为早期的Java团队没有彻底考虑这个问题。CharSequence
接口是在Java 4(1.4)中添加的,因此已经存在期望一个字符串的签名。 - Basil BourqueStringBuilder
这个类,它是从1.5版本开始引入的,也有这两种构造函数呢? - fgepublic StringBuffer(String str) : 构造一个字符串缓冲区,其内容初始化为指定字符串的内容。字符串缓冲区的初始容量为16加上字符串参数的长度。
public StringBuffer(CharSequence seq) : 构造一个包含与指定CharSequence相同字符的字符串缓冲区。字符串缓冲区的初始容量为16加上CharSequence参数的长度。 如果指定的CharSequence的长度小于或等于零,则返回容量为16的空缓冲区。
String
被替换成了CharSequences
... - BetlistaString
实现了CharSequence
,所以它与第一个构造函数匹配...而且两者的实现是相同的,因此这是明确的复制和粘贴。 - Betlista