Java15 Collection单列集合List
集合体系¶
集合分为两类: Collection单列集合 Map双列集合
集合的结构图:

其中:
无序:指存入和提取的顺序不一定样.
Collection:
add的返回值:
contains的注意:
字符串怎么比的?因为java底层已经把字符串的equals写好了.
Collection的遍历方式:
-
迭代器遍历
hasNext这个命名很烂.不如叫hasVaule.表示当前指向的位置有效.
next()不如叫getVauleAndMoveToNext.
注意:这里str是对原来list元素的引用.但是,一旦我们尝试对str重新赋值,由于str不可变,相当于改变了str指向的方向,并不会修改原来数组的值.(另外,Integer也是不可变的)如果迭代器指的位置不合法,调用next会抛出NoSuchElementException异常. 迭代器遍历完毕,指针不会复位.如果你想还用迭代器,那么需要重新获取新的迭代器对象. 迭代器遍历的时候,如果对原先的集合用集合的方法(如list.add("abc"))进行增删,那么会造成迭代器失效. 这时候如果强行用,会抛出ConcurrentModifycationException并发修改异常. 如果我想删除,那么就需要使用方法: it.remove();删除迭代器返回的最后一个元素.如:
这是不会造成迭代器失效的.
添加怎么办?暂时没有办法. -
增强for遍历 底层就是迭代器,为了简化迭代器代码出现的.和cpp一样. 出现在JDK5. 增强for适用于单列集合 数组

IDEA中打字list.for 然后按tab就会自动生成.
如果我们修改s的值,那么会发生什么? 答:并不会修改原来的元素.原因同上.
- lambda表达式遍历foreach
Collection成员方法有个foreach.foreach的实现:
tip:不过有意思的是,这个Consumer是有两个接口的.
如何写?
底层原理:
遍历原来的数组(注意,这里展示的源码是ArrayList的),然后action.accept传入这些元素.
修改成Lambda表达式:

优雅.
List系列集合.
注意,Collection的add只有一个参数,会把传入的元素添加到末尾.
问:List系列和Collection都有remove方法,那么传入一个Integer,调用的究竟是根据Index删除元素,还是删除元素1?
调用的是哪个?
为什么?
这里方法出现重载了.因此,会优先调用实参和形参一样的.我们这里传入的1是int类型,因此会匹配remove(int);
如果我们传的是包装类,那么就会匹配第一种.具体如下:

- 遍历方式:
除了上面的三种,还有普通的for循环遍历.以及:
List迭代器: ListIterator类 继承于Iterator类
多出来的方法,通过迭代器添加.
反向迭代:
但是这很难见,因为必须先让迭代器走到末尾之后,再调用上面两个才能完成反向遍历.
迭代器的底层:
Itr当中,int expectedModCount = modCount是什么?modCount是"集合变化的次数"
每一次调用List本身的add/remove时,都会把modCount++.
而当Itr使用next的时候,会检测:当前modCount是否和迭代器创建时的modCount一致.如果一致,那么就说明这期间没有进行过修改.