public class TestStringAddress {
public static void main(String[] args) {
//1常量池
String a = "abc";
String b = new String("def");
String c = "abc";
String d = b.intern();
String e = "def";
System.out.println(a.hashCode());//96354
System.out.println(b.hashCode());//99333
System.out.println(c.hashCode());//96354
System.out.println(d.hashCode());//99333
System.out.println(e.hashCode());//99333
System.out.println(a==c);//true
System.out.println(b==d);//false,b是堆中String对象,d是直接指向“def”的,而b则是指向b的实例的,两个是不同的实例。
System.out.println(d==e);//true
System.out.println(b==e);//false,同理,e也是直接指向def字符串的。
//2.字符串截取
String s1 = new String("abcdef");//实质是该方法读取了原来字符串的对象的部分,并返回了新的对象
String s2 = s1.substring(2, 4);
System.out.println(Integer.toHexString(s1.hashCode())); // 打印:ab199863
System.out.println(Integer.toHexString(s2.hashCode()));// 打印:c61, 显然s1和s2不是同一个对象
//3.编译器做了优化,直接在编译的时候将字符串进行拼接
String str1 = "hello" + " java";//相当于str1 = "hello java";
String str2 = "hello java";
System.out.println(str1 == str2);//true
String str3 = "hello";
String str4 = " java";
String str5 = str3 + str4;//编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化,拼接时需要拿到具体指向的值
System.out.println(str2 == str5);//false
}
}
关联文章:
https://blog.youkuaiyun.com/qq_42755868/article/details/105050352