Java 下列哪种方法会导致s引用的字符串对象发生更改?

Java 下列哪种方法会导致s引用的字符串对象发生更改?,java,string,Java,String,1-s.concat() 2-s.toUpperCase() 3-s.替换() 4-s.valueOf() 这里没有一个选项,人们的得分是100%,所以我假设每个操作都将返回值分配回s 我看到了所有方法的代码。全部返回新字符串()。但是这个答案是错误的 根据我的理解,所有4个都应该引起对象引用的更改。但根据techgig,这是错误的 对于问答题,请遵循以下步骤:- 拜访 登录到它 “打开练习”选项卡 转到java部分 开放式入门初级 此方法都不会更改s引用的字符串对象,因为String对象是不

1-
s.concat()

2-
s.toUpperCase()

3-
s.替换()

4-
s.valueOf()


这里没有一个选项,人们的得分是100%,所以我假设每个操作都将返回值分配回s

我看到了所有方法的代码。全部返回
新字符串()
。但是这个答案是错误的

根据我的理解,所有4个都应该引起对象引用的更改。但根据techgig,这是错误的

对于问答题,请遵循以下步骤:-

  • 拜访
  • 登录到它
  • “打开练习”选项卡
  • 转到java部分
  • 开放式入门初级

此方法都不会更改
s
引用的字符串对象,因为
String
对象是不可变的。因此,无论您执行什么函数,它都会创建一个新的
字符串
对象,您可以将其分配给其他引用或
s
本身。当您将这个新创建的对象分配给
s
时,
s
引用将指向这个新对象

例如:

String s  = "hello";
//Now perform all four operation one by one
s.concat("world");
s.toUpperCase();
s.replcae("l", "m");
s.valueOf(true);

System.out.println(s);

即使在所有这些操作之后,输出仍然是:hello

将所有选项放在一边
s.toUpperCase()
将抛出编译错误,因为它们需要参数。也许这个问题想让你注意到这一点,并标记出这个选项。当然,正如许多人所注意到的,
String
是不可变的,因此不可能更改一个
String
对象,但您可以更改
s
变量以具有另一个
String
引用,因为没有
s=new String()
  • 根据我的知识和研究,你问题的正确答案是
    s.concat()
    s.toUpperCase()
    。正如你所说,许多程序员的分数都是100%,所以你可以试试这个。你也会得到100%的分数。而且,我在测验中得到了100%的分数
  • 字符串文本在公共池中具有相同的内容共享存储,Java的字符串设计为不可变。让我们举个例子
    String s1=“Java”

    String s2=“Java”

  • s1
    s2
    都指向相同的内存空间,即构造一个字符串,其内容不能修改。否则,共享同一存储位置的其他字符串引用将受到影响

  • toUpperCase()等方法似乎可以修改字符串对象的内容。实际上,将创建一个全新的字符串对象并将其返回给调用方。一旦不再有引用,原始字符串对象将被释放,并随后被垃圾回收

  • 你的问题在很多测验中被问到,我发现有些页面给出了答案,但没有解释。您可以在和网站上查看答案


引用

字符串
是不可变的。所以!=测验通过引擎。“我不想通过任何测验”!=“根据techgig,这个答案是错误的。”如果你学习了,请补充解释。如果你知道答案,请把它贴在这里。@SSP你知道为什么要打印出
abc
?如果调用
System.out.println(s.toUpperCase())
您将看到
ABC
,但正如您已经看到的
s
的值并没有改变(它仍然保持对
ABC
对象的引用)。之所以会发生这种情况,是因为简单地返回对新字符串的引用并不意味着原始引用将也不应该更改。要更改它,我们需要显式地编写
s=s.toUpperCase()。这里没有选项,人们的分数为100%,因此我假设每个操作都将返回值赋回s。是否应该以静态方式访问
s.valueOf(true)
?e、 g
String.valueOf(true)
?是的,完全同意,不建议使用object调用静态方法,尽管它在语法上是正确的。但我这样做只是为了不偏离讨论的重点。