gpt4 book ai didi

java - 为什么修改了 ArrayList 参数,但没有修改 String 参数?

转载 作者:IT老高 更新时间:2023-10-28 20:34:25 29 4
gpt4 key购买 nike

public class StackOverFlow {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("A");
al.add("B");
markAsNull(al);
System.out.println("ArrayList elements are "+al);

String str = "Hello";
markStringAsNull(str);
System.out.println("str "+ str);
}
private static void markAsNull(ArrayList<String> str){
str.add("C");
str= null;
}
private static void markStringAsNull(String str){
str = str + "Append me";
str = null;
}
}

这个输出:

ArrayList elements are [A, B, C]
str Hello

ArrayList 的情况下,正在检索添加的元素。在 String 的情况下,方法调用对传递的字符串没有影响。 JVM到底在做什么?谁能详细解释一下?

最佳答案

In the case of Arraylist string objects the added elements are getting retrived. In case of String the method call has no effect on the String being passed.

这是因为 Java 是按值传递的,而 String 是不可变的

当你打电话时

markAsNull(ArrayList<String> str)

一个名为 str 的新引用是为 al 指向的同一个 ArrayList 创建的。当您在 stradd 一个元素时,它会被添加到同一个对象中。稍后您将 str 放入 null 但对象添加了新值并由 a1 指向。

当你打电话时

markStringAsNull(String str)
{
str = str + "Append me";
// ...
}

str = str + "Append me"; 行通过附加给定字符串创建一个新的 String 对象并将其分配给 str .但同样它只是对现在指向新创建的字符串的实际字符串的引用。 (由于不可变)并且原始字符串没有改变。

关于java - 为什么修改了 ArrayList 参数,但没有修改 String 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15871825/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com