簡體   English   中英

get方法返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM