写在前面
前段时间准备面试,发现java中String类是重头戏,网上众说纷纭,结合自己的理解总结一下。
到底创建了几个对象
//1
String s1 = "hello";
//2
String s2 = "hello":
//3
String s3 = new String("hello");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
我的理解(暂且先不关注不同JDK版本字符串常量池的位置):
对于1,因为字符串常量池中没有与“hello”字符串相等(即equals方法判定)的String对象,所以在字符串常量池中创建一个值为“hello”的String对象,并将其地址返回给s1,因此栈上的s1中保存的是常量池中该“hello”String对象的地址;
对于2,因为字符串常量池中已有与“hello”字符串相等(即equals方法判定)的String对象,因此返回该对象的地址;
对于3,首先判断字符串常量池中是否存在与“hello”字符串相等(即equals方法判定)的String对象,如果有,则使用该对象在堆中创建一个新的String对象(即使用该构造函数public String(String original),更直接的理解就是使用s1引用的对象拷贝出了一个新的对象,而且是浅拷贝,因此才能解释为什么保存s1的char数组的地址和保存s3的char数组指向同一个地址),然后返回该对象的地址。
最后
本文会持续不断补充关于String的疑惑,纯个人总结和理解,若有更理论的理解,欢迎交流和指正。