带有new运算符和文字的java字符串

Bha*_*gav 2 java string

假设我们创建String s如下

String s = new String("Java");
Run Code Online (Sandbox Code Playgroud)

所以上面的声明将在遇到new运算符时创建一个新对象.

假设我们在同一个程序中声明一个新的String s1,如下所示:

String s1 = "Java";
Run Code Online (Sandbox Code Playgroud)

这会创建一个新对象,还是指向使用Java的旧对象,因为它已经使用上面的new运算符创建.

Jon*_*eet 8

那么,第二行不会创建一个新的对象,因为你已经使用了相同的字符串中的第一行不断-但s1s仍然指向不同的对象.

第二行不会创建新对象的原因是汇总了字符串常量 - 如果多次使用相同的字符串常量,则它们都被解析为相同的字符串.当然,仍然必须String在某个时刻分配一个对象 - 但是对于所有用途,只有一个对象.例如,考虑以下代码:

int x = 0;
for (int i = 0; i < 1000000; i++) {
    String text = "Foo";
    x += text.length();
}
Run Code Online (Sandbox Code Playgroud)

不会创建一百万个字符串 - text在循环的每次迭代中,值都是相同的,每次都引用相同的对象.

但是如果你刻意创建一个新的 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
Run Code Online (Sandbox Code Playgroud)

换句话说,上面的前四行大致相当于:

String literal = "test";
String a = new String(literal);
String b = new String(literal);
String x = literal;
String y = literal;
Run Code Online (Sandbox Code Playgroud)

  • @iamreptar:它**只创建一个字符串,如果这是该程序到目前为止第一次使用该常量.我认为更清楚地说它需要字符串存在,并在必要时创建它.你不能在程序中间指出那个语句,然后说"那个语句创建一个新对象"就像你用`Object x = new Object(); (2认同)