有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,将每个元素添加到列表与仅将列表分配给另一个元素有什么区别

有人能告诉我把每个元素添加到一个列表和仅仅把一个列表分配给另一个列表之间的区别吗

//此构造函数未通过某些测试

public Assembler(List<Fragment> fragments) {
    this.fragments = fragments;
}

//而此构造函数将传递所有这些

public Assembler(List<Fragment> fragments) {
    for(int i = 0; i<fragments.size(); i++){
           this.fragments.add(fragments.get(i));
       }

}

共 (2) 个答案

  1. # 1 楼答案

    你的第一个例子:

    public Assembler(List<Fragment> fragments) {
        this.fragments = fragments;
    }
    

    在前一个示例中,您正在覆盖列表。任何使用this.fragments中的元素现在不再在this.fragments中,而是this.fragments现在指向一个全新的列表

    这是否重要取决于this.fragments最初是如何声明的。这可能是因为它的声明方式已经包含了一些变量:

    private List<Fragment> fragments = new ArrayList<Fragment>(Arrays.asList(fragment1, fragment2, fragment3));
    

    在这种情况下,所有这些都将被覆盖。但对于实例变量来说,这是不寻常的行为

    测试失败的另一个更可能的原因是引用——可能有一个测试在某个地方执行类似的操作:

    Assembler a = new Assembler(fragments);
    assertFalse(fragments == a.fragments);
    

    在这种情况下,通过评估是否调用了相同的引用,可以明确地检查您是否只是复制了列表

    类似地,如果你做了赋值操作,它可能会导致意外行为,比如在fragments中添加一个项,并让它显示在a.fragments中,这可能也是不需要的


    在后一个示例中,您将添加到列表中:

    public Assembler(List<Fragment> fragments) {
        for(int i = 0; i<fragments.size(); i++){
               this.fragments.add(fragments.get(i));
           }
    
    }
    

    这会保留对每个单独元素的引用,但不会重新分配this.fragments,这样即使在之后,fragmentsthis.fragments也会引用不同的对象,因此修改其中一个不会修改另一个

    不过,有一种比使用for循环更简洁的方法:

    public Assembler(List<Fragment> fragments) {
        this.fragments.addAll(fragments);
    }
    
  2. # 2 楼答案

    我创建了一个非常简单的方法,向您展示了差异。在第一种情况下,两个List引用同一个对象,因此修改一个将同时修改这两个对象。在第二个版本中,它们是分开的,因此修改一个不会修改另一个

         List<String> frag1 = new ArrayList<>();
         List<String> frag2 = new ArrayList<>();
         List<String> frag3 = new ArrayList<>();
    
         frag1.add("I was added to frag1");
         frag1.add("I also was added to frag1");
    
    
         frag2 = frag1;
    
         for (String s : frag1)
         {
         frag3.add(s);
         }
    
         frag2.add("I was added to frag2");
         frag3.add("I was added to frag3");
    
         System.out.println("Frag1: " + frag1.toString());
         System.out.println("Frag2: " + frag2.toString());
         System.out.println("Frag3: " + frag3.toString());
    

    这将输出:

    Frag1: [I was added to frag1, I also was added to frag1, I was added to frag2]
    Frag2: [I was added to frag1, I also was added to frag1, I was added to frag2]
    Frag3: [I was added to frag1, I also was added to frag1, I was added to frag3]
    

    如您所见,当Frag2向原始List添加一个值时,原始List发生了更改,Frag1Frag2都是相等的。然而,在使用第二种构造方法的String中添加Frag3不会影响Frag1的原始值,并且与现在的Frag2Frag1都不同