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

时间:2018-10-08 21:47:41

标签: immutability operator-keyword ternary

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

dnaString
LETTERALETTERBchar

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

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

如果您编写类似以下内容的内容:
String testStr = "test";
testStr + "example";
您收到错误InvalidAssignmentOperator,所以有人可以向我解释为什么您可以在这样的三元运算符中添加到String吗?

1 个答案:

答案 0 :(得分:1)

string + something创建了一个新的String,因此原始的String保持不变(必须是不变的),并且有一个 new 不变的{{ 1}}的末尾带有新字符。

这就是为什么三元运算符可以正常工作的原因。它将在String的任一侧创建一个或另一个新的String(取决于:之前的条件),并将您创建的一个还给您。


您提供的代码错误对我来说是不同的,所以我不确定:

?

我想你可能是这个意思

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

可以编译。原因是对象String testStr = "test"; testStr += "example"; 是不可变的,而不是变量"test"是不可变的。除非您将变量标记为testStr,否则以后可以使变量引用另一个对象。

有点像您从信封中删除一个地址并写另一个地址。您尚未更改该地址上有关房屋的任何信息(您没有对房屋进行变异)。您刚刚更改了所指的房屋(您刚刚更改了指代房屋的信封)。

首先,final是指testStr。以后,它引用"test"。旧的,不变的"testexample"仍然存在,直到被垃圾回收为止。它没有改变。创建了一个全新的"test",现在该变量是不可更改的,它引用了一个新的不可更改的String