[英]get method return value
我在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方法是否返回列表元素的深層或淺層副本?
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
是不可變的。
在StringBuilder a = list.get(3);
的情況下StringBuilder a = list.get(3);
你得到一個對索引為3
元素的引用賦值給變量a
,使用a
將影響索引3
元素進行修改。 其中int b = alist.get(1);
你在元素的副本1
賦給變量b
如此調整不會影響在元素1
。 沒有之間的連接b
在與元件1
分配之后。
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;
實際上,您在int b =...
創建了list元素的淺表副本。 由於List包含Integer類型的對象,因此您在此處對原始整數進行新賦值,而使用StringBuilder則可以使用完全相同的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.