假设我们创建了String s
,如下所示
String s = new String("Java");
所以上面的声明会在遇到new运算符时创建一个新对象。
假设我们在同一个程序中声明了一个新的String s1,如下所示:
String s1 = "Java";
这会创建一个新对象,还是指向带有Java的旧对象,因为它已经使用上面的new运算符创建。
答案 0 :(得分:8)
好吧,第二行不会创建新对象,因为你已经在第一行使用了相同的字符串常量 - 但s1
和s
仍会引用不同的对象。
第二行不会创建新对象的原因是汇总了字符串常量 - 如果多次使用相同的字符串常量,则它们都被解析为相同的字符串。当然,仍然必须在某个时刻分配String
个对象 - 但是对于所有用途,只有一个对象。例如,请考虑以下代码:
int x = 0;
for (int i = 0; i < 1000000; i++) {
String text = "Foo";
x += text.length();
}
这将不创建一百万个字符串 - text
的值在循环的每次迭代中都是相同的,每次都引用相同的对象。
但是如果你故意创建一个 new String
,那肯定会创建一个新对象 - 只是基于现有数据。例如:
String a = new String("test");
String b = new String("test");
String x = "test";
String y = "test";
// Deliberately using == rather than equals, to check reference equality
System.out.println(a == b); // false
System.out.println(a == x); // false
System.out.println(x == y); // true
或者换句话说,上面的前四行大致相当于:
String literal = "test";
String a = new String(literal);
String b = new String(literal);
String x = literal;
String y = literal;
答案 1 :(得分:1)
String myString = new String("Java");
创建两个对象。
String myString = "Java";
创建一个对象。
答案 2 :(得分:0)
为了创建新对象,我们使用新关键字,如果不使用Object
则无法创建new
。
根据第一个实例中的声明,创建了一个新的Object
,但在第二个实例中,您只是声明一个带有值的变量。
所以它不是Object
。
答案 3 :(得分:0)
String s1 =“foo”; 将在StringPool中创建文字。
字符串s2 =“foo”; 这次它将检查“foo”文字在StringPool中是否已经可用,因为它现在存在,所以s2将引用与s1相同的文字。
String s3 = new String(“foo”); “foo”literal将首先在StringPool中创建,然后通过字符串arg构造函数String对象将被创建,即堆中的“foo”由于通过new运算符创建对象,然后s3将引用它。
答案 4 :(得分:0)
当你使用文字创建一个String(例如String str =“Hello”;)时,不会在Heap中创建Object,它只能在StringPool中使用,但是当你使用'new'运算符创建一个String时(例如String str) = new String(“Hello”))然后创建StringPool中的Object以及Heap中的另一个对象。所以我们不必要地创建了两个对象。因此,使用文字创建字符串是首选方式。