2017-02-09 84 views
1
List<Object> lo=new ArrayList<>(); 
    List<String> ls=new ArrayList<>(); 
    List<String> ls1=new ArrayList<>(); 

    //lo=ls; 
    ls1=ls; 

    ls1.add("ddd"); 

    System.out.println(ls.get(0));//output :ddd 

我的問題是,我在LS1加入「DDD」但我得到「DDD」從ls.How這可能嗎?是LS1和LS相同列表?Java的泛型亞型讓我迷惑

+1

你的問題與泛型分型無關。 –

+0

謝謝你們我得到了我的答案.... –

回答

0

沒有,他們起初不一樣的,但是當你說ls1=ls;分配在ls1ls的地址,因此它們的內存地址是平等的,現在如果你改變ls1ls已經改變,反之亦然如果你想使兩個列表沒有這個地址,你可以使用clone方法

List list = new ArrayList(); 
    list.add("A"); 

    List list2 = ((List) ((ArrayList) list).clone()); 

    System.out.println(list); 
    System.out.println(list2); 

    list.clear(); 

    System.out.println(list); 
    System.out.println(list2); 

輸出將是:

[A] 
[A] 
[] 
[A] 
+0

'clone'是一個高級API,它有很多問題,可能是OP的一個不好的選擇。 –

+0

@LewBloch @LewBloch我不在乎那些沒有用的評論,並且說了大量的東西,你的評論沒有理由,所以祝你好運:) –

+0

你的cm不會幫助我改進我的答案,你被迫寫無用的cm這裏 –

1

ls1=ls;

這將使雙方的引用ls1ls指向同一個對象list。以前被ls1引用的list將不再可訪問,並且將被Java垃圾回收。

所以,是的,無論您使用ls1添加到/從list中刪除,將通過ls反映,反之亦然,因爲它們指的是相同的列表。

1

這是邏輯,因爲當你分配你的LS列表LS1其實ls1=ls;它們指向同一個地址在內存中,如果你添加一些認爲第一個列表中,您將獲得在第二相同的結果重新登錄。

3

不,它們不一樣。他們只指向相同的內存位置。

ls1=ls; 

上面的代碼片段使兩個列表指向相同的內存位置。所以對ls1的任何更改也會對ls進行更改。

1

你別名了。 ls1ls指向相同的對象。