当前位置: 首页 > 知识库问答 >
问题:

为什么修改的是ArrayList参数,而不是String参数?[副本]

阎扬
2023-03-14
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到底在做什么?有人能详细解释一下吗?

共有1个答案

唐伟
2023-03-14

对于Arraylist字符串对象,将检索添加的元素。对于字符串,方法调用对所传递的字符串没有影响。

当你打电话的时候

markAsNull(ArrayList<String> str)

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

当你打电话的时候

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

str=str+“append me”;通过追加给定字符串创建一个新的string对象,并将其分配给str。但同样,它只是对实际字符串的引用,而实际字符串现在指向新创建的字符串。(由于不可变)并且原始字符串不变。

 类似资料:
  • 问题内容: public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList (); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al);

  • 我不懂pyplot。子地块(330 1 i)

  • 问题内容: 我正在尝试了解Python的可变范围方法。在此示例中,为什么能够更改在x内部感知到的值,但不能更改? main() 输出: 问题答案: 一些答案在函数调用的上下文中包含单词。我感到困惑。 Python不复制对象的函数调用中传递过。 功能参数是名称。调用函数时,Python会将这些参数绑定到你传递的任何对象上(通过调用方作用域中的名称)。 对象可以是可变的(如列表)或不可变的(如Pyth

  • 谁能告诉我为什么函数参数不能是?这是函数参数在上声明并在函数返回时被取消分配的原因吗?没有办法保留参数值?只是糊涂了。请澄清。 多谢了。

  • 使用指南 - 统计设置 - 第三方推广管理 - 什么是URL参数? 我们经常可以看到URL后面带有?Par1=xxx&Par2=xxx的类似样式,其中Par1、Par2即为该URL的参数。“?”是参数与URL的链接符,“&”是参数与参数之间的链接符。利用这种方式,我们便可以通过URL来传递信息。 以百度统计中的”指定广告跟踪”功能为例,就是利用在URL中添加指定的参数,实现区分推广页面中的广告信息

  • 问题内容: 这一直使我感到困惑。看起来这样会更好: 比这个: 是否有特定原因? 问题答案: 这是因为任何可迭代对象都可以连接(例如,列表,元组,字典,集合),但是其内容和“连接器” 必须是 字符串。 例如: 使用字符串以外的其他东西会引发以下错误: