为什么Java中的某些方法会修改原始值而有些则不会?

JSO*_*SON 2 java groovy

Concat()方法不会修改原始值.它返回一个新值.
像这样:

String str = "good";
str.concat("ness");
System.out.println(str);   //"good"
Run Code Online (Sandbox Code Playgroud)

但有些方法会修改原始值.为什么?

在Groovy中:

def languages = ["Java", "Groovy", "JRuby"]
languages.reverse()
===> [JRuby, Groovy, Java]
println languages
===> [Java, Groovy, JRuby]


languages.sort()
===> [Groovy, JRuby, Java]
println languages
===> [Groovy, JRuby, Java]
Run Code Online (Sandbox Code Playgroud)

coo*_*ird 11

String在Java中是不可变的.任何"修改"a的方法都String必须返回一个新的实例String.

用于Java API规范String:

字符串是不变的; 它们的值在创建后无法更改.

Java语言规范第4.3.3节:类字符串中定义了这种行为.


对编辑的回应:

似乎在Groovy中添加了一个示例.(我之前没有使用过Groovy,所以我对它的理解可能不正确.)

根据我从查看示例的理解,似乎有一个languages列表正在被reverse-ed和sort-ed - 这些操作本身不会修改String列表中包含的对象,而是对列表本身起作用.

列表的方式返回一个新列表,或者它如何修改或不修改列表与String对象本身的行为无关.