可能重复:
What is the purpose of the expression “new String(…)” in Java?
您好,
1)两个陈述的区别是什么:
String s1 = "abc";
和
String s1 = new String("abc")
2)因为我没有在第一个语句中使用new,所以如何创建字符串对象
由于
答案 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);