2017-02-09 82 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指向相同的对象。