当前位置: 首页 > 面试题库 >

字符串不变性。更改后是否需要将其重新分配给相同的变量?

丁兴德
2023-03-14
问题内容

字符串是不可变的,这是否意味着我总是必须通过将字符串传递给方法来做类似的事情?

str= str.toLowerCase();

或者是

str.toLowerCase();

精细?我尝试了第二个,它没有给我任何错误,为什么?


问题答案:

字符串是不可变的

是的,您自己承认。不可变 对象 是不允许其状态更改的对象。这包括String对象。

然后:

str.toLowerCase();

创建一个 的小写字母字符串, 并且不使用result
。在这种情况下,这很可能是一个“错误”,因为它str仍然评估原始字符串对象(由于它是不可变的,因此 更改)。

没有编译器错误,因为Java无法知道返回值是“应该使用”的。
有时会调用一种方法来产生副作用,即使该方法也返回一个值*。在某些纯语言(没有副作用的语言)中,可以将其判断为错误,但是在具有副作用的语言中,这是不可能的。一些静态分析工具(不是javac,它只是带有原始警告集的编译器),可以通过应用其他启发式规则来检测上述错误。

同上,但分配 新的字符串相同的变量 :(变量 值/对象)。

str = str.toLowerCase();

但是, 不要求 将相同的变量重新分配给它。考虑以下示例,这些示例在上下文中可能完全有效:

String normalizedTitle = title.toLowerCase();
foo.setTitle(normalizedTitle);
// or, skip normalizedTitle, etc.
foo.setTitle(title.toLowerCase());

快乐的编码。

*导致副作用 返回通常被忽略的值的相对常见方法的示例是List.remove(int)



 类似资料:
  • 问题内容: 第一个System.out打印 2 并且应该打印,而第二个System打印 65 。我已经用这种语言编程了一年多了,据我所知这是不可能发生的!有什么帮助吗? 上面的代码在两行上都显示 9 。 问题答案: 当你这样做,之前仅仅是一个参考阵列, NO 新阵列已创建并分配给。因此,当您查看自己的价值时,基本上就是查看的价值,反之亦然。只是的别名。这就是为什么在第二张照片中您得到65。 检查该

  • 问题内容: 在Python中,可以分割字符串并将其分配给变量: 但在Go中似乎无效: 问题: 如何在一个步骤中拆分字符串并分配值? 问题答案: 例如两个步骤 输出: 例如一个步骤 输出:

  • 问题内容: 我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。 我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象: 我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一

  • 问题内容: 我发现能够在运行时创建新变量并创建结果字典以供以后处理(即写入文件)非常有用。 这将创建字典条目[result1:data1],我可以使用myDict [result1]对其进行调用。我一直在使用vars()而不真正了解我在做什么。我认为它返回带有局部变量(?)的字典,并且 vars()[x] = y 创建一个新的[x:y]字典条目? 我有一个脚本,其中传递了一个用{input1:da

  • 在Bash脚本中,我想定义一个布尔变量y来存储另一个布尔变量x的求反值。以下脚本, 将变量y设置为1。如何更改y,使其计算结果改为false?

  • 这是我目前所拥有的,但它不起作用。如何连接所有内容?我认为问题在于逗号。