有 Java 编程相关的问题?

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

java重复链接列表

我想复制链接列表中的元素。这就是我尝试过的:

public class duplicate  {
      public static void main(String[] args) {

        LinkedList <Integer> list = new LinkedList<Integer>() ;
        list.add(2); 
        list.add(3); 
        list.add(4); 
        list.add(1); 
        list.add(0); 

        for( int i= 0 ; i<list.size(); i++) {   
          list.addAll(list);
          System.out.println(list);
          break; 
        }

      }
    }

但我有一个无限循环


共 (3) 个答案

  1. # 1 楼答案

    Appends all of the elements in the specified collection to the end of this list, in the order that they are returned by the specified collection's iterator (optional operation) (...)

    那么,顺便说一下,你很好:

    LinkedList <Integer> list = new LinkedList<Integer>() ;
    //... code omitted (adds every number)
    list.addAll(list);
    
    • 但是,如果您想使用^{}而不是List.addAll,您可以使用like this(需要为循环使用):

      LinkedList <Integer> list = new LinkedList<Integer>() ;
      //... code omitted (adds every number)
      int initialSize = list.size();
      for( int i = 0 ; i < initialSize; i++) {   
        list.add(list.get(i));
      }
      
      System.out.println(list);
      
  2. # 2 楼答案

    您在for循环中一次又一次地添加列表元素

    for(int i= 0 ; i < list.size(); i++) {   
       list.addAll(list);
       System.out.println(list);
    }
    

    每一次它都会成长&;这会导致每次迭代的规模不断增长。纠正步骤。使用局部变量存储大小或更改逻辑

  3. # 3 楼答案

    您只需执行list.addAll(list);

    如果要将add方法用作练习,则需要在开始迭代之前小心地保存列表的原始大小。您可以在for循环的初始化部分执行此操作:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(Arrays.asList(2, 3, 4, 1, 0));
        for (int i = 0, size = list.size(); i < size; i++)
            list.add(list.get(i));
        System.out.println(list);
        assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
    }
    

    现在您会注意到上面使用的是ArrayList,而不是LinkedList。一般来说,您应该更喜欢ArrayList。甚至是Java的LinkedList says he doesn't use it的作者。另见this SO question about ArrayList vs LinkedList

    如果您使用LinkedList,您可以将上面的第二行替换为:

        List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));
    

    代码的其余部分可以保持不变。但是,如果列表很长,那么使用LinkedList类的get(index)方法可能会降低性能。在LinkedList中,如果迭代(使用LinkedList.iterator()增强的for循环,比使用带有get()的普通for循环获得更高的性能电话。但是在添加到列表时不能迭代列表,因为这样会得到ConcurrentModificationException。相反,您可以将链接列表复制到数组中,并在该数组上迭代,同时添加到列表中:

    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));
        for (Integer element : list.toArray(new Integer[0])) {
            list.add(element);
        }
        System.out.println(list);
        assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
    }