在“堆”区域中创建新对象的好处是什么,当找不到对对象的引用时,这将很快收集垃圾?

时间:2018-10-31 14:30:39

标签: java string garbage-collection immutability string-pool

String s = new String("abc");

在这里,如果“ abc”不存在,则将在字符串常量池中创建新对象。将在堆区域中再创建一个对象。

s = s.concat("def");

如果“ def”不存在,将在String常量池中创建一个新对象,并在堆区域中保存一个包含“ abcdef”的对象。 s的引用将移至新创建的对象。不久,gc()会将初始对象标识为未引用,并将其从堆中删除。

如果JVM删除旧的对象,那么在堆区域创建额外的对象有什么好处。为什么我们不能分配给相同的初始对象。我知道这是不变性的概念,但是为什么在没有好处的情况下我们需要在堆区域中保持不变性。我接受常量池中的不变性具有对象可重用性的好处。

请提出您的意见,如果我错了请指正

1 个答案:

答案 0 :(得分:0)

我的问题集中在为什么我们要保留旧对象。问题可能是为什么我们需要不变性。

这里是答案

安全性:参数通常在网络连接,数据库连接url,用户名/密码等中以字符串表示。如果可变,则可以轻松更改这些参数。

同步和并发性:使String不可变自动使其线程安全,从而解决了同步问题。

缓存:当编译器优化您的String对象时,它会看到如果两个对象具有相同的值(a =“ test”和b =“ test”),因此您只需要一个字符串对象(对于a和b,这两个都指向同一个对象。

类加载:字符串用作类加载的参数。如果可变,则可能导致错误的类加载(因为可变对象更改其状态)。