- 在同一个类中,字符串字面量引用同一个字符串对象。例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
System.out.println(world == "world");
}
}
运行输出:
csharp
true
- 在同一个包的不同类中,字符串字面量引用同一个字符串对象。例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
System.out.println(world == Another.world);
}
}
package com.thb;
public class Another {
public static String world = "world";
}
运行输出:
csharp
true
- 在不同包的类中,字面量引用同一个字符串对象。例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
System.out.println(world == com.thb.bian.BianOther.world);
}
}
package com.thb.bian;
public class BianOther {
public static String world = "world";
}
运行输出:
csharp
true
- 用常量表达式拼接的字符串是在编译的时候被计算的,因此作为字符串字面量对待。例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
System.out.println(world == ("wor" + "ld"));
}
}
运行输出:
csharp
true
- 运行时拼接生成的字符串是被新建的,因此是不同的。例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
String ld = "ld";
System.out.println(world == ("wor" + ld));
}
}
运行输出:
csharp
false
- 通过显式调用字符串的intern()方法返回的字符串和以前存在的字符串字面量指向同一个字符串对象。
当调用字符串的intern()方法的时候,会首先到字符串池中查找,如果找到相同的字符串(是否相同是用equals(Object)方法来判断的),则返回池中字符串的引用;如果没有找到相同的字符串,那么就将本字符串增加到字符串池中,然后返回池中字符串的引用。
例如:
csharp
package com.thb;
public class Demo4 {
public static void main(String[] args) {
String world = "world";
String ld = "ld";
System.out.println(world == ("wor" + ld).intern());
}
}
运行输出:
csharp
true