Java中的String和StringBuffer有什么区别?
2022-08-31 15:46:39
Java中的String和StringBuffer有什么区别?
字符串是否有最大大小?
Java中的String和StringBuffer有什么区别?
字符串是否有最大大小?
String
用于操作无法更改的字符串(只读和不可变)。
StringBuffer
用于表示可以修改的字符。
性能方面,在执行串联时更快。这是因为当您连接 一个 时,每次都会创建一个新对象(内部),因为这是不可变的。StringBuffer
String
String
您也可以使用与它类似的方法,只是它未同步。其中任何一个的最大大小为 (231 - 1 = 2,147,483,647) 或最大堆大小除以 2(请参阅 Java 字符串可以包含多少个字符?)。更多信息请点击这里。StringBuilder
StringBuffer
Integer.MAX_VALUE
A 是不可变的,即当它被创建时,它永远不会改变。String
A(或其非同步表亲)用于当您需要逐个构造字符串时,而不会产生在此过程中构造大量小s的性能开销。StringBuffer
StringBuilder
String
两者的最大长度都是 Integer.MAX_VALUE,因为它们在内部存储为数组,而 Java 数组只有一个长度伪字段。int
对于多个串联,s 和 s 之间的性能改进非常显著。如果运行以下测试代码,您将看到差异。在我装有Java 6的古老笔记本电脑上,我得到了以下结果:String
StringBuffer
Concat with String took: 1781ms Concat with StringBuffer took: 0ms
public class Concat
{
public static String concatWithString()
{
String t = "Cat";
for (int i=0; i<10000; i++)
{
t = t + "Dog";
}
return t;
}
public static String concatWithStringBuffer()
{
StringBuffer sb = new StringBuffer("Cat");
for (int i=0; i<10000; i++)
{
sb.append("Dog");
}
return sb.toString();
}
public static void main(String[] args)
{
long start = System.currentTimeMillis();
concatWithString();
System.out.println("Concat with String took: " + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
concatWithStringBuffer();
System.out.println("Concat with StringBuffer took: " + (System.currentTimeMillis() - start) + "ms");
}
}