Java String对象创建

时间:2010-06-02 08:54:51

标签: java string

  

可能重复:
  What is the purpose of the expression “new String(…)” in Java?

您好,

1)两个陈述的区别是什么:

String s1 = "abc";

String s1 = new String("abc")

2)因为我没有在第一个语句中使用new,所以如何创建字符串对象

由于

2 个答案:

答案 0 :(得分:3)

在第一种情况下,编译器知道String s1的值。因此,具有相同值的所有字符串将使用相同的内存位置:

String s1 = "abc";
String s2 = "abc";

虽然有两个String引用(s1和s2),但内存中只有一个“abc”序列。不需要new运算符,因为编译器完成了这项工作。

在第二种情况下,编译器不执行String值的求值。因此,该句子将在运行时生成一个新的String实例:

String s1 = "abc";
String s2 = new String("abc");

第1行中的常量“abc”引用与第2行中的常量“abc”相同的内存。但第2行的净效果是创建新的String实例。

答案 1 :(得分:3)

第一个将使用将在代码中编译的固定String。第二个变体使用固定的String并通过复制字符创建一个新的String。这实际上在内存中创建了一个新的独立对象,并不是必需的,因为字符串是不可变的。有关详细信息,请参阅this thread

内置字符串的主要优点是性能更好(例如通过缓存等)。

作为程序员,创建新String没有真正的好处,除非你得到以下例子:

String sentence = "Lorem ipsum dolor sit amet";
String word = sentence.substring(5);

现在这个词有一个对句子的引用(substring不复制字符)。在使用句子时这很有效,但是当这个句子被丢弃时,你会使用比需要更多的内存。在这种情况下,可以创建一个新的String:

word = new String(word);