Java Generic Subtyping让我感到困惑

时间:2017-02-09 19:48:29

标签: java

    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

我的问题是,我添加了&#34; ddd&#34;在ls1但我得到了#ddd&#34;来自ls.How是否可能?ls1和ls是否相同List?

5 个答案:

答案 0 :(得分:3)

不,他们不一样。它们只指向相同的内存位置。

ls1=ls;

上面的代码片段使两个列表都指向相同的内存位置。因此,ls1的所有更改也会在ls中进行更改。

答案 1 :(得分:1)

ls1=ls;

这将使引用ls1ls指向同一个list对象。 list之前引用的ls1将不再可访问,并且将被Java垃圾收集。

所以,是的,无论您使用list引用添加到ls1 /从ls添加/删除的内容都将通过value="<?php echo set_value('s_county') 反映出来,反之亦然,因为它们指的是相同的列表。

答案 2 :(得分:1)

这是逻辑,因为当您将ls列表分配给ls1 ls1=ls;时,实际上它们指向内存中的相同地址,如果您添加一些思考到第一个列表中将在第二次重新安置时获得相同的结果。

答案 3 :(得分:1)

你是别名的。 ls1ls指向同一个对象。

答案 4 :(得分:0)

,起初它们不一样,但是当您在ls1=ls;中分配ls ls1的地址时,它们的内存地址位置相等,现在如果您更改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]