获取方法返回值

时间:2018-10-02 10:48:22

标签: java list arraylist

我在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方法将list元素的浅表副本(对于StringBuilder)返回到a,但是将深层副本(对于整数而言)返回到b! 为什么会发生? get方法返回列表元素的深层副本还是浅层副本?

3 个答案:

答案 0 :(得分:3)

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

在第一个代码段中,您对变量a所引用的对象进行了突变,因此List也受到了影响:

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

在第二个代码段中,为变量b分配了一个新值,该值不会影响List

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

为了使第一个代码片段像第二个代码片段一样工作,您应该编写:

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

List不会受到影响。

相反,您不能使第二个片段表现得像第一个一样。即使您将List元素分配给Integer变量,您也无法调用任何会对其进行突变的方法,因为Integer是不可变的。

答案 1 :(得分:1)

对于StringBuilder a = list.get(3);,您可以引用分配给变量3的索引a上的元素,使用a进行的修改将影响索引{{1}上的元素}。在3中,您在int b = alist.get(1);处获得了分配给变量1的元素的副本,因此对其进行修改不会影响b处的元素。分配后1b上的元素之间没有连接。

1

答案 2 :(得分:0)

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

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

相关问题