Java字符串对象创建

Java字符串对象创建,java,string,Java,String,可能重复: 嗨 1) 这两种说法的区别是什么: String s1 = "abc"; 及 2) 由于我在第一条语句中没有使用new,所以将如何创建string对象 谢谢在第一种情况下,编译器知道字符串s1的值。因此,具有相同值的所有字符串将使用相同的内存位置: String s1 = "abc"; String s2 = "abc"; 尽管有两个字符串引用(s1和s2),但内存中只有一个“abc”序列。不需要new运算符,因为编译器执行此任务 在第二种情况下,编译器不执行字符串值的计算。因

可能重复:

1) 这两种说法的区别是什么:

String s1 = "abc";

2) 由于我在第一条语句中没有使用new,所以将如何创建string对象


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

String s1 = "abc";
String s2 = "abc";
尽管有两个字符串引用(s1和s2),但内存中只有一个“abc”序列。不需要
new
运算符,因为编译器执行此任务

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

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

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

第一行将使用一个固定字符串,该字符串将在代码中编译。第二个变量使用固定字符串并通过复制字符创建新字符串。这实际上在内存中创建了一个新的独立对象,并且不是必需的,因为字符串是不可变的。有关更多信息,请阅读

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

作为程序员,创建新字符串没有真正的好处,除非您使用以下示例:

String sentence = "Lorem ipsum dolor sit amet";
String word = sentence.substring(5);
现在,单词引用了句子(子字符串不复制字符)。这是有效的,而句子也被使用,但当这一个被扔掉,你使用了比需要更多的内存。在这种情况下,可以创建一个新字符串:

word = new String(word);

这里有另一个好答案:So String s1=“abc”;创建任何对象/实例或只是分配内存由于字符串对象是不可变的,两者之间没有区别。事实上:您可以在字符串常量中调用字符串方法:int stringLength=“hello”.length();。。。我怀疑这个例子是否正确,因为
String(String s)
构造函数没有创建新的char数组,而是保留了引用。与
子字符串(int a,int b)
一样,它在内部调用
新字符串(int start,int length,char[]chars)
它检查大小写,并创建一个新的调整大小的数组。
字符串(String s)
构造函数会在原始值比视图长得多的情况下进行复制。从javadoc:
初始化一个新创建的{@code String}对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本
word = new String(word);