如果java中的字符串是不可变的,为什么我可以这样做?

如果java中的字符串是不可变的,为什么我可以这样做?,java,Java,我意识到变量名的hashCode在“update”之后是不同的,但是客观上是什么使得String对象实际上是不可变的呢 public static void main(String[] args) { String str = "AB"; System.out.println(str ); // AB str = str .replace(str .charAt(0) ,'W'); System.out.println(s

我意识到变量名的hashCode在“update”之后是不同的,但是客观上是什么使得String对象实际上是不可变的呢

public static void main(String[] args) {

        String str = "AB";
         System.out.println(str ); // AB

         str = str .replace(str .charAt(0) ,'W');
         System.out.println(str );//WB

 }
编辑1:哈希代码基于变量的值,与内存地址无关

编辑2:我现在知道字符串本身是引用而不是对象。 我把同一个问题的所有答案都读了一遍,在像[这个]()这样的主题中找到了很好的答案。谢谢你试图帮助我和我的任何愚蠢的误解的借口

我还向希望更好地了解字符串在Java中如何工作的人推荐本文:

参考文献的工作原理:

编辑3:我不能再删除这个话题了,根据Stackoverflow的说法,“你不能删除这个问题,因为其他人已经投入了时间和精力来回答它。”我同意这一点。

如果你看一下,它提到:

返回一个新字符串,该字符串由newChar替换该字符串中所有出现的oldChar生成


因此,替换的字符串是一个全新的字符串。

替换返回的字符串是另一个字符串。变量不是对象。您只是用对另一个字符串的引用覆盖对一个字符串的引用,而不是对该字符串进行变异。您正在为同一个变量分配一个新字符串。变量始终是可变的,因为即使对象本身是不可变的,也可以使它们引用新对象。变量是可变的(duh)。顺便说一句,这不是变量的地址,而是变量指向的对象的地址(或者变量的内容(因为它是一个引用/指针))((还没有检查文档,但怀疑没有解释))你说得对,伙计,我的错是不要先看文档。但是,我知道hashCode并不表示变量的内存地址,那么我如何检查或确认字符串的不变性呢?@RaphaelSilva(也许还有其他关于同一问题的答案)可能会有帮助。嘿@Anoop,谢谢你的回答。在结束这个话题之前,我做了我的研究,我想在这里为后代回答我自己的问题。@RaphaelSilva当然,请继续!