Java中的String和StringBuffer有什么区别?

2022-08-31 15:46:39

Java中的String和StringBuffer有什么区别?

字符串是否有最大大小?


答案 1

String用于操作无法更改的字符串(只读和不可变)。

StringBuffer用于表示可以修改的字符。

性能方面,在执行串联时更快。这是因为当您连接 一个 时,每次都会创建一个新对象(内部),因为这是不可变的。StringBufferStringString

您也可以使用与它类似的方法,只是它未同步。其中任何一个的最大大小为 (231 - 1 = 2,147,483,647) 或最大堆大小除以 2(请参阅 Java 字符串可以包含多少个字符?)。更多信息请点击这里StringBuilderStringBufferInteger.MAX_VALUE


答案 2

A 是不可变的,即当它被创建时,它永远不会改变。String

A(或其非同步表亲)用于当您需要逐个构造字符串时,而不会产生在此过程中构造大量小s的性能开销。StringBufferStringBuilderString

两者的最大长度都是 Integer.MAX_VALUE,因为它们在内部存储为数组,而 Java 数组只有一个长度伪字段。int

对于多个串联,s 和 s 之间的性能改进非常显著。如果运行以下测试代码,您将看到差异。在我装有Java 6的古老笔记本电脑上,我得到了以下结果:StringStringBuffer

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");
    }
}