具有三元运算符的不可变字符串

Immutable Strings with Ternary Operator

我正在做一个项目,我写了这段代码
dna = Math.random() > PERCENT ? dna + LETTERA : dna + LETTERB; 我不完全知道它为什么有效。

dna 是一个 String
LETTERALETTERBchar

代码本身按照我想要的方式工作,问题是我不明白为什么。我认为 Java 中的字符串是不可变的,所以当我说 dna + LETTERA 时,我应该收到一个错误,但我没有。

起初我写代码时没有使用 dna + LETTERB 我使用了 dna += LETTERB 但我收到以下错误,Syntax error on token "+=", + expected

如果你这样写:
String testStr = "test";
testStr + "example";
你得到一个错误 InvalidAssignmentOperator 所以有人可以向我解释为什么你可以像这样在三元运算符中添加到字符串吗?

string + something 创建一个新的 String,所以原来的 String 没有改变(它必须是因为它是不可变的)并且有一个 new 不可变的 String 在其末尾创建了新字符。

这就是三元运算符工作正常的原因。它会在 : 的任一侧创建一个或另一个新的 String(取决于 ? 之前的条件)并返回它创建的那个。


你给出的代码错误对我来说是不同的,所以我不确定:

error: not a statement
        testStr + "example";
                ^

我想你可能是这个意思:

String testStr = "test";
testStr += "example";

即编译。原因是对象 "test" 是不可变的,但变量 testStr 不是。除非该变量被您标记为 final,否则您稍后可以让该变量引用不同的对象。

这有点像从信封上擦掉一个地址并写上一个不同的地址。你没有改变那个地址的房子的任何东西(你没有改变房子)。您刚刚更改了所指的房子(您刚刚改变了指代房子的信封)。

起初,testStr指的是"test"。后来指的是"testexample"。旧的、不可变的 "test" 仍然存在,直到它被垃圾收集。它没有改变。创建了一个全新的 String,现在变量不是不可变的,而是指一个新的不可变的 String.