【问题标题】:How can i get a new object in arrayList.remove()如何在 arrayList.remove() 中获取新对象
【发布时间】:2020-10-02 21:01:36
【问题描述】:
    ArrayList<ArrayList<Integer>> treeList = new ArrayList<>();
    ArrayList<Integer> aList = new ArrayList<>();
    ArrayList<Integer> bList = new ArrayList<>();


    aList.add(1);
    treeList.add(aList);

    bList = treeList.remove(0);
    aList.clear();  //bList will be cleared

我知道bList和aList会引用同一个对象,所以当aList.clear()时,bList也会清空,有没有办法让bList成为一个新对象。

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    ...有没有办法让bList 成为一个新对象。

    你可以复制它;例如

    bList = new ArrayList<>(treeList.remove(0)); 
    

    How to copy Java Collections list


    实际上,这看起来像是一个可以从编写您自己的自定义类中受益的案例。

    正如所写,您的treeList 是一个开放数据结构。任何可以访问treeList 或其任何组件ArrayList 对象的东西都可以干扰它。在某些情况下没关系。但是,如果您想防止代码库的不同部分“弄乱”数据结构,那么您应该将数据结构置于抽象边界之后;例如

    public class MyThing {
        private ArrayList<ArrayList<Integer>> treeList = new ArrayList<>();
    
        public void add(ArrayList<Integer> l){
            treeList.add(new ArrayList<>(l));
        }
    
        public void remove(int index) {
            return new ArrayList<>(treeList.remove(index));
        }
    }
    

    请注意,MyThing 在添加和删除列表时会小心复制列表,以便MyThing API 的一个客户端无法通过共享列表干扰另一个客户端。

    显然,这样做是有代价的。

    【讨论】:

      【解决方案2】:

      或者,而不是分配:

      bList = treeList.remove(0);
      

      你可以使用List#addAll

      bList.addAll(treeList.remove(0));
      

      【讨论】:

      • 同意。我们遇到的问题是 OP 没有解释他们真正想要做什么。根据真正的问题是什么,这可能是一个更好的解决方案。
      【解决方案3】:

      试试这个。将 remove 的返回值作为参数传递给 ArrayList 构造函数。

      ArrayList<ArrayList<Integer>> treeList = new ArrayList<>();
      ArrayList<Integer> aList = new ArrayList<>();
      ArrayList<Integer> bList = new ArrayList<>();
      
      
      aList.add(1);
      treeList.add(aList);
      
      bList =  new ArrayList<>(treeList.remove(0));
      aList.clear();  //bList will be cleared
      System.out.println(bList);
      

      打印

      [1]
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多