如何在java中从ArrayList创建新集合

时间:2017-08-26 08:43:51

标签: java arraylist

我想对ArrayList进行排序,并且应该在ArrayList的副本上进行排序。

我已经尝试了以下但它正在对原始列表进行排序,并且我在排序列表上进行的任何更改也会反映在原始列表中。

List <Stud>  list = new ArrayList<>();
list.add( new Stud(1,"Sachin")  );
list.add( new Stud(2,"Niteen")  );
Set <Stud> set = new HashSet<>( list );
Stud s = set.iterator().next();
System.out.println( "S:"+s );
s.setRoll( 10 );
System.out.println( "list: "+list );
System.out.println( "set : "+set );

在arraylist和set中都设置了10号滚动,如何避免这种情况。 如果你解释它为什么会发生这种情况会很有帮助。

2 个答案:

答案 0 :(得分:0)

在集合上使用复制构造函数时,它会创建新集合并添加旧集合中的所有元素。你需要的是复制元素,为此目的使用forEach()并创建元素的副本。

答案 1 :(得分:0)

    List <Stud>  list = new ArrayList<>();
    list.add( new Stud(1,"Sachin")  );
    list.add( new Stud(2,"Niteen")  );
    Set <Stud> set = new HashSet<>();
    //copy using forEach
    for(Stud s : list){
        set.add(new Stud(s.getRoll(),s.getName()));
    }
    Stud s = set.iterator().next();
    System.out.println( "S:"+s );
    s.setRoll( 10 );
    System.out.println( "list: "+list);
    System.out.println( "set : "+set );

我不确定你的项目,但这似乎是这样做的唯一方法。您正在创建两个对象,并在两个不同的集合实例中使用相同的对象。即使集合实例不同,您的下划线对象也是相同的。因此,如果您更改其中一个属性,它将反映在您使用的所有集合实例中。因此,只能通过引用上面给出的新 Stud 对象来克隆它们。

相关问题