您必须发布章节(顺便说一下,请不要)以完整地给出上下文,但我可以为您进一步区分这两个概念。
final 是 java 中的一个关键字,在您的情况下,它适用于引用变量。这意味着一旦对象被实例化,该变量就不能被分配给不同的对象,即,如果你这样做:
final String[] stringArray = new String[8];
你再也不能这样了:
stringArray = new String[2];//stringArray is final and cannot be reassigned
但这并不表示 stringArray 的内容是否无法更改。你可以这样做:
stringArray[3] = "Hey!";
它会编译得很好。这向您表明,不能仅将引用重新分配给其他任何东西;我们在这里只讨论参考。
当他们说 String 是不可变的时,他们是在谈论 String 常量池。在字符串常量池中,有一组在内存中创建的字符串,这些字符串被存储起来以供重用。如果你说,例如:
String tempString1 = "yo";
String tempString2 = "yo";
您仅在字符串常量池(字符串所在的内存的特殊部分)中创建了 1 个字符串对象,并将其分配给两个不同的引用变量。如果你这样做:
tempString2 = "hey";
String tempString3 = "yo";
你只在字符串常量池中再次创建了 1 个新对象,“嘿”。 tempString1 只更改了它指向的内容,而 tempString3 正在重用已经创建的“yo”。
如果你这样做是因为你对 Java 很着迷:
tempString1 = tempString2 + tempString3;
String tempString4 = tempString2 + tempString3;
String tempString5 = tempString2 + tempString3;
您只创建了 1 个字符串“heyyo”。 "yo" "hey" 和 "heyyo" 是字符串常量池中唯一的字符串。
您所做的任何操作都不会更改字符串常量池中的“hey”和“yo”,即使您可能会更改输出以使这些字符串看起来已更改。