当前位置:网站首页>List集合数据移除(List.subList.clear)

List集合数据移除(List.subList.clear)

2022-07-06 09:33:00 小白说(๑• . •๑)

List集合数据移除(List.subList.clear)

这两天遇到这么一个问题:一个集合的数据当作参数传入,现在分段使用这个集合的数据,使用完的数据需要在这个集合中被移除,方便获取第二段的数据。

假设:一个集合的数据长度是11个,现分两段使用这个集合,第一段使用5个数据,第二段使用6个数据,达到分段使用集合的数据。为了能正确的获取到数据,获取完成第一段数据之后,将前五个数据从list集合中移除,然后在获取第二段数据,这样也方便循环。

最开始我是这样做的remove(),移除数据:

public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("g");
        list.add("h");
        list.add("i");
        // 模拟获取第一段前五个数
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
            list.remove(i);
        }
        // 模拟获取第二段后6个数
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
            list.remove(i);
        }
    }

因为ArrayList是线程不安全的,在循环中这样做很明显不合适,并发情况下很可能会出现问题。

所有我换了另外一种方法,removeAll(),移除List中的数据:


    public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("a");
        list.add("a");
        list.add("a");
        // 模拟获取第一段前五个数
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
        }
        list.removeAll(oneList);
        // 模拟获取第二段后6个数
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
        }
        list.removeAll(twoList);
    }

注意集合中的数据发生了变化,这也是我后来才发现的变化:
在这里插入图片描述

list原本有11个数据,取出5个之后应该还剩下6个数据,但是removeAll之后还剩下3个数据,这样肯定是不对的,因为这会让获取第二段数据的时候出现数组下标越界的异常。

后来看源码才发现,removeAll移除的是相同的元素。

查资料发现使用迭代器不会移除重复的元素,不过迭代器移除数据不是我想要的方式,也达不到我想要的效果。

最后发现使用subList()获取当前集合的子集去移除是靠谱的,并且没有出现上面两种问题。

    public static void main(String[] args) {
    

        List<String> list = new ArrayList<>();

        list.add("g");
        list.add("k");
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        list.add("a");
        list.add("a");
        list.add("a");
        // 模拟获取第一段前五个数
        List<String> oneList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
    
            oneList.add(list.get(i));
        }
        // 获取子集清除数据
        List<String> subList_1 = list.subList(0, 5);
        subList_1.clear();
        // 模拟获取第二段后6个数
        List<String> twoList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
    
            twoList.add(list.get(i));
        }
        list.subList(0, 6).clear();
    }

在最后要说明一下subList作用和参数:

subList是获取当前集合的子集的方法

参数fromIndex:指定新列表的起始点(包括该点)

参数toIndex:指定新列表的终点(不包括该点)

个人理解为从下标fromIndex开始取值,取toIndex个值。

参考连接

http://c.biancheng.net/view/4743.html

原网站

版权声明
本文为[小白说(๑• . •๑)]所创,转载请带上原文链接,感谢
https://blog.csdn.net/dongzi_yu/article/details/109212182