基础篇-集合List

集合不同于数组

集合:容量动态扩充,必须引用类型,对象继承体系(多态)
数组:容量静态固定,允许基本类型,JVM底层实现
双列系列
HashMap
Map
HashTable
Properties
单列系列
Collection
Iterable
List
Set
ArraryList
LinkedList
Vector
HashSet
TreeSet

Collection接口方法

成员方法

// 根据自定义条件移除元素,removeIf重写函数时方法
collections.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                if ("BusClassObject".equals(s)) {
                    return true;
                }
                return false;
            }
        });
// 判断元素是否存在集合中
collections.contains("a");

转为数组

collections.toArray();

重写ForEach

默认获取击中元素并返回

获取迭代器

collections.stream().iterator();
collections.iterator();

迭代器方法异常

NoSuchElementException
原因:next()移动迭代指针超出内容元素

Collection<Object> objects = new ArrayList<>();
objects.add("1");
objects.add("2");
objects.add("3");
Iterator<Object> iterator = objects.iterator();
iterator.next();
iterator.next();
iterator.next();
iterator.next();

IllegalStateException
remove方法将移除源数组next指针上一个元素,使用remove必须先使用next方法

if (iterator.hasNext()) {
            iterator.remove();
}

ArraryList 数组集合

方法:主要对索引进行操作
结构:内存连续,元素连续,需要计算机连续的内存空间
优点:基于索引,查询快
缺点:删除或插入元素将会使其位置后面的元素

扩充机制:创建arrayList对象时容量为0,一次添加元素,进行扩充取默认值(10)的数组,直到集合对象容量满时触发下一次扩充,扩充容量为 oldArraySize+oldArraySize>>1 即上一次的1.5倍(JDK代码避免对1.5的浮点数计算)的新数组,将旧数组内容拷贝到新数组中

建议:当能确定元素数量时,一定要进行初始化arrayList对象容量,避免扩充时机的CPU资源浪费.

添加:每次添加新的元素将会时成员变量size++
长度:当然获取长度直接获取size变量

Vector 数组集合(线程安全系列)

线程安全所以效率低,不推荐使用

LinkedList 链表集合

方法:主要对链表头尾进行操作,也可以进行索引操作
结构:内存不连续,通过链记录头尾元素,计算机零碎的内存空间即可

添加:一个Noed结点分为(头地址值 元素内容 尾地址值)三部分,头记录常量,尾记录常量
第一个值会修改头记录常量,最后添加的总是会修改尾记录常量
插入修改

ArraryList 数组集合和LinkedList 链表集合

[物理结构]
	ArrayList 内存中空间连续
	LinedList 内存中空间不连续,需要记录首尾元素地址	
[存取顺序]
	一致
[index索引]
	ArraryList有绝对索引,索引直接定位元素
	LinkedList相对索引,需要计算具体位置
[普通for]
	ArraryList查询遍历通过index绝对索引直接定位元素
	LinkedList普通for遍历,使用相对索引,需要间接性寻找到相对索引的位置,相当耗时【不推荐】
[派生迭代器ListIterator]
	Iterator的派生类,专注于List系列,不能用于Set
[增强for]
	拷贝源集合的副本,使用伪指针进行next跳转到一下个指针,依次遍历推荐使用
[关于插入,删除元素]
ArraryList
	头 
	中
	尾
LinkedList
	头
	中
	尾

源码传送门

Demo

对List集合进行去重

本人土锤解决方案,双指针比较去重,p慢指针,q快指针

static void method1(List<Object> objects) {
        if (objects == null || objects.size() == 0) {
            return;
        }

        int p = 0;
        int q = 1;
        while (p < objects.size() - 1) {
            if (q == objects.size()) {
                if (objects.get(p).equals(objects.get(--q))) {
                    objects.remove(--q);
                }
                p++;
                q = p + 1;
                continue;
            }
            if (objects.get(p).equals(objects.get(q))) {
                objects.remove(q);
            } else {
                q++;
            }
        }
    }

    

jdk提供的 stream流式去重传送门

static void method2(List<Object> objects){
        List<Object> collect = objects.stream().distinct().collect(Collectors.toList());
        System.out.println(collect);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值