【问题标题】:Immutable Strings with Ternary Operator具有三元运算符的不可变字符串
【发布时间】:2019-03-13 14:43:18
【问题描述】:

我正在做一个项目,我写了这段代码
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 那么有人可以向我解释为什么你可以在这样的三元运算符中添加一个字符串吗?

【问题讨论】:

  • 之所以有效,是因为我写的三元运算符以dna = 开头,我很困惑为什么dna + LETTERA 有效,但如果您查看整个语句,它是dna = dna + LETTERA。现在一切都说得通了。

标签: immutability operator-keyword ternary


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2021-08-01
    • 1970-01-01
    • 2012-12-19
    • 2016-09-09
    • 2019-01-09
    • 2014-04-10
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多