这是正确的
根据“Murachs Java编程”,当您为字符串变量分配新值时,将删除原始字符串对象,并将其替换为新的String对象。
但根据我的教授,对象保留在字符串常量池中,只有引用变量现在指向新分配值的新内存位置。
答案 0 :(得分:1)
两者都不正确。
Murach书的引用是错误的。当没有更多引用时,前一个值引用的对象是解除引用,并成为符合条件的以进行垃圾回收。这可能会也可能不会发生。毫无疑问,它会被新对象立即删除或替换。
您的教授也是错误的,除了字符串文字,编译时字符串表达式和已被实习的String
对象的特定情况。
答案 1 :(得分:0)
根据“Murachs Java编程”,当您为字符串变量分配新值时,将删除原始字符串对象,并将其替换为新的String对象。
这是不正确的。赋值给String变量不会导致删除任何内容,也不会导致创建新的String对象。这适用于所有作业。实际上,没有Java 中的任何操作可以说会导致删除对象。你可以说最好的是一个赋值可能导致一个对象无法访问,一个无法访问的对象最终将无法访问。
但根据我的教授,对象保留在字符串常量池中,只有引用变量现在指向新分配值的新内存位置。
这是更接近的,但在几个重要方面也是不正确的:
大多数String对象不是首先在字符串池中创建的,并且不会去那里。在常规堆中创建常规String
(不是字符串池 * )。用户代码在字符串池中创建对象的唯一方法是调用String.intern()
...这将(如果需要)分配并返回字符串池中的对象。
在运行时表示字符串 literals 的String对象确实存在于字符串池中。但是,用户代码不会创建它们。相反,它们通常是在第一次使用文字的方法时在字符串池中创建的 ** 。
新分配的String引用不一定是指新的内存位置。它可能指向很久以前创建的对象。
* - 在旧版本的Java中,字符串池保存在一个名为“permgen”堆的特殊堆中,该堆具有与之关联的不同垃圾收集策略。在当前版本中,“permgen”不再存在,字符串池只是主堆中的数据结构。
** - 同样,这是特定于Java版本的。将字符串文字插入sting池可以更早出现;例如当班级被加载时。