假设我们创建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运算符创建.
那么,第二行不会创建一个新的对象,因为你已经使用了相同的字符串中的第一行不断-但s1和s仍然指向不同的对象.
第二行不会创建新对象的原因是汇总了字符串常量 - 如果多次使用相同的字符串常量,则它们都被解析为相同的字符串.当然,仍然必须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)
| 归档时间: |
|
| 查看次数: |
3032 次 |
| 最近记录: |