集合
# 集合
# collectio
# removeIf
removeIf () 方法底层会遍历集合,得到集合中的每一个元素
如果返回一个 true 则删除该传入的元素删除
可以使用 lambda 函数
Collection<String> array = new ArrayList<>();
array.add("aaa");
array.add("bbb");
array.add("cccc");
array.removeIf(
(String s) ->
s.length() == 3
);
2
3
4
5
6
7
8
9
# 迭代器
# iterator()
返回集合中的迭代器对象
Iterator<String> it = list.iterator();
# hasNext()
判断当前位置是否有元素可被取出
有返回 true 没有则返回 false
# next()
将迭代器对象指向下一个元素,并返回当前元素
while (it.hasNext()){
System.out.println(it.next());
}
2
3
# 增强 for 循环
所有的 (Collection) 单列集合都可以使用迭代器或增强 for, 双列集合无法使用
for(String s : list){
System.out.println(s);
}
2
3
# List
查询数据,数组通过地址值和索引定位元素,查询任意数据耗时相同, 查询速度快
删除数据,要将被删数据删除,同时后面个每个数据前移, 删除效率低
添加数据,添加位置后的每个数据后移,再添加元素, 添加效率极低
# 单向链表
链表通过每个结点 (元素) 指向下一个结点的地址值来形成链表,如只有 1 个结点则该结点的指向地址为空 (结束结点)
查询数据,(无论查询是位置还是元素) 只能从头结点一直查询到被查结点, 查询效率慢
删除数据,只需要修改被删除结点前一个结点的指向地址为被删结点的后一个结点即可. 删除效率快
添加数据,添加结点与删除结点类型,只需在添加位置更改前后结点的指向地址即可. 添加效率快
# 双向链表
单向链表每个结点只存储 值和下一个结点的地址.
而双向保留 3 个数据,分别为,前一个结点的地址 值 下一个结点的地址。这样我们可以从后找到前或从前找到后。查询位置的时候会判断离头结点近还是尾结点近来进行链表查询
# ArrayList 源码
默认空参构造方法 是创建一个长度为 0 的数组
当调用 add 方法会把长度为 0 的 ArrayList 初始化为长度为 10, 并且都为 null, 源码方法名为 elementData
并且会有一个变量 size 标记当前数组元素长度
如果 size 超出了默认长度 10 或者当前数组长度,则会自动扩容,扩容为当前数组长度 1.5 倍的大小,扩容后的数组为空,把原来的数组拷贝到新的数组中,并且 size 保持不变.
# 遍历 ArrayList
ArrayList 中提供了 size 方法,直接返回当前 size (即为最后一个元素的下标), 而不是返回 ArrayList 的长度