1. java里的new 一个String对象时都会在堆内存里产生一个对象。
String str = new String("abc") 首先检查String Pool里有没有值为abc的对象,如果没有会先在String Pool里产生一个值为abc的对象,然后再在堆内存里拷贝一个值为abc的对象,然后把堆内存里的对象的地址赋值给str,如果String Pool里有一个值为abc的对象,则直接从String Pool里的值拷贝一份值为abc的对象到堆内存,然后把堆内存里的对象的地址赋值给str.
String str = "abc' 这种方式创建的字符串,会首先看String Pool里有没有值为abc的对象,如果有,则直接把String Pool里abc对象的内存地址复制给str即可,如果没有则在String Pool里创建一个值为abc的对象,然后把创建的新的对象的内存地址赋值给str即可
java 代码
public class Test {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
}
输出结果;
false
false
false
2. String.intern() ,返回的是String Pool里相同值的对象的地址。
所以:
java 代码
public class Test {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str1.intern());//false
System.out.println(str2 == str2.intern());//true
System.out.println(str1.intern() == str3.intern());//true
}
}
3 字符串用+号连接
如果+号两边都是字面常量的话,都会先去String Pool里找值相等的对象.如果没有找到则会在String Pool里创建一个新的对象。
如果+号两面有一个不是字面常量的话,则会在堆里创建一个新的对象。
java 代码
public class Test {
public static void main(String[] args) {
String hello = "hello";
String lo = "lo";
System.out.println(hello == "hel" + "lo");//+号两边都是字面常量,会在String Pool里创建,所以返回true
System.out.println(hello == "hel" + lo);//+号右边不是字面常量,则会在堆内存里创建,所以返回false
}
}