我正在做一个项目,我写了这段代码
dna = Math.random() > PERCENT ? dna + LETTERA : dna + LETTERB;
,但我不知道为什么会这样。
dna
是String
LETTERA
和LETTERB
是char
代码本身按我想要的方式工作,问题是我不明白为什么。我以为Java中的字符串是不可变的,因此当我说dna + LETTERA
时,我应该收到一个错误,但我没有。
起初,当我编写代码时,我没有使用dna + LETTERB
,但我使用了dna += LETTERB
,但收到以下错误,Syntax error on token "+=", + expected
如果您编写类似以下内容的内容:
String testStr = "test";
testStr + "example";
您收到错误InvalidAssignmentOperator
,所以有人可以向我解释为什么您可以在这样的三元运算符中添加到String吗?
答案 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
。