记录分享一下学习它们的区别
debug下面的测试代码
可以看到s1和s2的 value指向同一个内存地址
我们接着往下走,发现当s3执行hashCode方法时,s3和s2对象的 hash值都改变了
证明他们是同一个对象(废话),所以我自己觉得它们在内存中应该是这样的(如果不对求大佬指正!):
s2和s3都指向一个存放在堆中字符串常量池的String对象,而这个对象的final char[] value指向的是由执行s1 = new String("shboui")时在字符串常量池创建的字符数组value。也就是说,s1 = new String("shboui")时会在字符串常量池中创建一个值为"shboui"的字符串数组value。
但是不知道是执行s1 = new String("shboui")创建字符串数组value之后立刻在stringtable中创建一个字符串常量对象,还是等到执行String s2 = "shboui" 时再在其中创建字符串常量对象.....
我认为应该是创建value数组之后并未创建对应的字符串常量对象,为什么呢?我们知道String提供了一个intern()方法,调用该方法会返回对应的字符串常量对象,如果stringtable(底层貌似是hashtable)中没有对应的字符串常量对象就创建之后再返回。
欢迎指正!