1.我在这两者之间感到困惑,如果是这样,它们是否具有不同的功能,那么如何?
StringBuffer(CharSequence chars)
和
StringBuffer(String str)
2. 字符串和字符序列之间的基本区别是什么(特殊功能)?
CharSequence
是一个接口,因此您无法直接实例化它。 String
是实现 CharSequence
接口的具体类。 StringBuffer
还实现了CharSequence
接口。
至于为什么StringBuffer
有两个构造函数,一个采用String
,另一个采用CharSequence
,几乎可以肯定是因为(根据Javadoc中的Since
行)直到Java v1.4才添加CharSequence
,而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
作为参数传递是有效的。
public StringBuffer(String str):构造初始化为指定字符串内容的字符串缓冲区。字符串缓冲区的初始容量为 16 加上字符串参数的长度。
public StringBuffer(CharSequence seq):构造一个字符串缓冲区,其中包含与指定 CharSequence 相同的字符。字符串缓冲区的初始容量为 16 加上 CharSequence 参数的长度。如果指定的 CharSequence 的长度小于或等于零,则返回容量为 16 的空缓冲区。
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuffer.java#StringBuffer.%3Cinit%3E%28java.lang.String%29