【问题标题】:get method return value获取方法返回值
【发布时间】:2019-03-07 11:49:23
【问题描述】:

我在 Eclipse 中运行以下代码:

ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
ArrayList<Integer> alist = new ArrayList<Integer>();

// add some elements ti list
list.add(new StringBuilder("hello"));
list.add(new StringBuilder("2"));
list.add(new StringBuilder("hi"));
list.add(new StringBuilder("this"));

// add some elements to alist
alist.add(4);
alist.add(9);


//get method
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;

// print the list
System.out.println("LinkedList:" + list);
System.out.println("ArrayList:" + alist);

结果就在这里

LinkedList:[hello, 2, hi, this is a good day]
ArrayList:[4, 9]

看起来get方法将列表元素的浅拷贝(在StringBuilder的情况下)返回给a,但将深拷贝(在整数的情况下)返回给b! 为什么会这样? get 方法返回列表元素的深拷贝还是浅拷贝?

【问题讨论】:

标签: java list arraylist


【解决方案1】:

StringBuilder a = list.get(3); 的情况下,您会获得对索引3 处的元素的引用,该引用分配给变量a,使用a 进行修改将影响索引3 处的元素。其中int b = alist.get(1); 将在1 处获得元素的副本,并将其分配给变量b,因此修改它不会影响1 处的元素。分配后b1 处的元素之间没有联系。

   StringBuilder a = list.get(3);
    a.append(" is a good day");
    int b = alist.get(1);
    b = 7;

【讨论】:

    【解决方案2】:

    get 返回对List 元素的引用,而不是副本(既不深也不浅)。

    在第一个 sn-p 中,你改变了变量 a 引用的对象,所以 List 也受到影响:

    StringBuilder a = list.get(3);
    a.append(" is a good day");
    

    在第二个 sn-p 中,您为变量 b 分配了一个新值,这不会影响 List

    int b = alist.get(1);
    b = 7;
    

    为了让你的第一个 sn-p 表现得像第二个,你应该写:

    StringBuilder a = list.get(3);
    a = new StringBuilder(" is a good day");
    

    List 不会受到影响。

    另一方面,你不能让第二个 sn-p 表现得像第一个。即使您将List 元素分配给Integer 变量,也不能调用任何会改变它的方法,因为Integer 是不可变的。

    【讨论】:

      【解决方案3】:
      StringBuilder a = list.get(3);
      a.append(" is a good day");
      int b = alist.get(1);
      b = 7;
      

      确实,您在int b =... 中创建了列表元素的浅表副本。由于您的 List 包含 Integer 类型的对象,因此您在此处对原始整数进行了新的分配,而使用 StringBuilder 您可以处理完全相同的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2016-07-12
        • 2019-01-28
        • 1970-01-01
        相关资源
        最近更新 更多