集合不同于数组
集合:容量动态扩充,必须引用类型,对象继承体系(多态)
数组:容量静态固定,允许基本类型,JVM底层实现
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);
}