关于安全删除Arraylist中的一组节点

思路:不能在集合循环过程中移除集合中的对象!先用一个新的集合记录原集合中需要删除的节点,然后遍历新的集合的每一个对象,如果是原集合中的对象,就删除

 if (mCustomerList.contains(processInfo)){
                mCustomerList.remove(processInfo);
            }

案例

     List<ProcessInfo> killProcessList = new ArrayList<>();
        for (ProcessInfo processInfo:mCustomerList){
            if(processInfo.getPackageName().equals(getPackageName())){
                continue;
            }
            if (processInfo.isCheck){
                //不能在集合循环过程中移除集合中的对象
//                mCustomerList.remove(processInfo);
                //3.记录要杀死的用户进程
                killProcessList.add(processInfo);
            }
        }
        for(ProcessInfo processInfo:mSystemList){
            if (processInfo.isCheck){
                //4.记录要杀死的系统进程
                killProcessList.add(processInfo);
            }
        }
        //5.遍历killProcessList,然后一处用户进程集合与系统进程集合中对象
        for (ProcessInfo processInfo : killProcessList){
            //6.判断集合有没有包含当前对象
            if (mCustomerList.contains(processInfo)){
                mCustomerList.remove(processInfo);
            }

            if (mSystemList.contains(processInfo)){
                mSystemList.remove(processInfo);
            }
        }
在Java,`ArrayList` 和 `LinkedList` 都是实现 `List接口` 的两种常用数据结构,它们有以下几个主要区别: 1. **存储结构**: - `ArrayList` 是基于动态数组实现的,内部是连续的内存空间,元素插入和删除操作通常涉及数组的移动,因此对尾部元素的操作(如添加或删除)效率较高,但对头部元素的操作较慢,因为要移动大量元素。 - `LinkedList` 则是由一系列节点链接起来的数据结构,每个节点包含一个元素值和指向下一个节点的引用。插入和删除元素时只需改变相邻节点的指针,对于头部和尾部的插入和删除操作速度较快,但对于随机访问(如获取某个位置的元素)来说效率较低,因为它需要遍历整个链表。 2. **性能**: - 查找、索引和访问元素(使用 `get(int index)`):在ArrayList,这些操作的时间复杂度通常是O(1),因为可以直接通过下标访问。而在LinkedList,由于需要从头开始遍历,时间复杂度为O(n)。 - 插入/删除元素:ArrayList在数组末尾插入删除元素时,时间复杂度是O(n);而LinkedList则可以在常数时间内完成,即O(1)。 3. **线程安全性**: - ArrayList本身不是线程安全的,如果在多线程环境下需要保证并发安全,需要配合Collections.synchronizedList()等同步机制。 - LinkedList有一个子类`ConcurrentSkipListLinkedList`,它是线程安全的,可用于高并发环境。 4. **内存消耗**: - ArrayList由于底层是数组,会在创建时分配固定大小的空间,可能会造成浪费。如果经常进行扩容,会有额外的开销。 - LinkedList内存消耗相对较低,因为它不预设固定大小,可以根据需要动态增长。 5. **排序**: - ArrayList提供了sort()方法,直接对其内容进行排序。 - LinkedList不支持原地排序,需要先转换成其他数据结构(如数组)再排序,然后转回来。 根据应用的具体需求,比如频繁的增删操作、不需要快速随机访问或者性能要求不高,可以选择ArrayList;而对于需要频繁插入和删除元素(尤其是头部),并且对顺序无关紧要的情况,LinkedList会更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值