String s = new String("abc");
在这里,如果“ abc”不存在,则将在字符串常量池中创建新对象。将在堆区域中再创建一个对象。
s = s.concat("def");
如果“ def”不存在,将在String常量池中创建一个新对象,并在堆区域中保存一个包含“ abcdef”的对象。 s的引用将移至新创建的对象。不久,gc()会将初始对象标识为未引用,并将其从堆中删除。
如果JVM删除旧的对象,那么在堆区域创建额外的对象有什么好处。为什么我们不能分配给相同的初始对象。我知道这是不变性的概念,但是为什么在没有好处的情况下我们需要在堆区域中保持不变性。我接受常量池中的不变性具有对象可重用性的好处。
请提出您的意见,如果我错了请指正
答案 0 :(得分:0)
我的问题集中在为什么我们要保留旧对象。问题可能是为什么我们需要不变性。
这里是答案
安全性:参数通常在网络连接,数据库连接url,用户名/密码等中以字符串表示。如果可变,则可以轻松更改这些参数。
同步和并发性:使String不可变自动使其线程安全,从而解决了同步问题。
缓存:当编译器优化您的String对象时,它会看到如果两个对象具有相同的值(a =“ test”和b =“ test”),因此您只需要一个字符串对象(对于a和b,这两个都指向同一个对象。
类加载:字符串用作类加载的参数。如果可变,则可能导致错误的类加载(因为可变对象更改其状态)。