Skip to content

Java15 Collection单列集合List

集合体系

集合分为两类: Collection单列集合 Map双列集合

集合的结构图: ed095fb4fa588c7b4c702a879344362d_MD5

其中: 66d82481b2699f8cdec8e6060d292340_MD5 无序:指存入和提取的顺序不一定样.

Collection: 1c4590bb85cba7866a6fe928f9f4dd43_MD5 ab028d9d74c7c2fe6b57c4311e95267d_MD5 add的返回值: b01afcef5f042a09a853153bb3465d89_MD5 bc3a819ff2068c5f27ce7d821a5cf7db_MD5 contains的注意: 9b085e2ea044ffd3b5a6f80056a2dbe0_MD5 字符串怎么比的?因为java底层已经把字符串的equals写好了.


Collection的遍历方式:

  • 迭代器遍历 28012d55ddd85d05d5238325fd764499_MD5 hasNext这个命名很烂.不如叫hasVaule.表示当前指向的位置有效. next()不如叫getVauleAndMoveToNext. bf4578d123b0e5425023735fe901904f_MD5 注意:这里str是对原来list元素的引用.但是,一旦我们尝试对str重新赋值,由于str不可变,相当于改变了str指向的方向,并不会修改原来数组的值.(另外,Integer也是不可变的) 如果迭代器指的位置不合法,调用next会抛出NoSuchElementException异常. 迭代器遍历完毕,指针不会复位.如果你想还用迭代器,那么需要重新获取新的迭代器对象. 迭代器遍历的时候,如果对原先的集合用集合的方法(如list.add("abc"))进行增删,那么会造成迭代器失效. 这时候如果强行用,会抛出ConcurrentModifycationException并发修改异常. 如果我想删除,那么就需要使用方法: it.remove();删除迭代器返回的最后一个元素.如: 33c579648d9d56fe64be4d719d835565_MD5 这是不会造成迭代器失效的. 添加怎么办?暂时没有办法.

  • 增强for遍历 底层就是迭代器,为了简化迭代器代码出现的.和cpp一样. 出现在JDK5. 增强for适用于单列集合 数组 28880e159a17507f63ee78a9a4819fef_MD5

IDEA中打字list.for 然后按tab就会自动生成.

如果我们修改s的值,那么会发生什么? 答:并不会修改原来的元素.原因同上.

  • lambda表达式遍历foreach Collection成员方法有个foreach.foreach的实现: 649ba8a211cf86a358858cab82146ab8_MD5 60fcc8181379870efbe8c714ddf5ae5e_MD5 tip:不过有意思的是,这个Consumer是有两个接口的. e5b546f4b84205a084830e3908bbdc59_MD5 如何写? 05a655d1084f23a060d67a3914df3806_MD5 底层原理: 6d1786758b2b83b679dea17446bb84cf_MD5 遍历原来的数组(注意,这里展示的源码是ArrayList的),然后action.accept传入这些元素.

修改成Lambda表达式: 12785cf58e2aae67f8ef71ec89880b00_MD5

优雅.


List系列集合. 97ef65ed7fac2beec973d07290e602b0_MD5 注意,Collection的add只有一个参数,会把传入的元素添加到末尾. 问:List系列和Collection都有remove方法,那么传入一个Integer,调用的究竟是根据Index删除元素,还是删除元素1? 45e6ae1a662135633ca7179343ba9bba_MD5 调用的是哪个? 39ab0a3969da5bdffa3d0871e1b757dc_MD5 为什么?

这里方法出现重载了.因此,会优先调用实参和形参一样的.我们这里传入的1是int类型,因此会匹配remove(int); 如果我们传的是包装类,那么就会匹配第一种.具体如下: 65f03beaa0e9a7e5fd35f0226ec66071_MD5

  • 遍历方式:

除了上面的三种,还有普通的for循环遍历.以及:

List迭代器: ListIterator类 继承于Iterator类 多出来的方法,通过迭代器添加. 4ea095eb382bc324e3162991762a8615_MD5 反向迭代: 5db972edc74aa902e6a784079fc228d1_MD5 79e5add2dba8c32821f6e88b804a4f7c_MD5 但是这很难见,因为必须先让迭代器走到末尾之后,再调用上面两个才能完成反向遍历.


迭代器的底层: 12732f005cbc2ff9b71459a4f6983954_MD5 Itr当中,int expectedModCount = modCount是什么?modCount是"集合变化的次数" 每一次调用List本身的add/remove时,都会把modCount++. 而当Itr使用next的时候,会检测:当前modCount是否和迭代器创建时的modCount一致.如果一致,那么就说明这期间没有进行过修改.