java 集合 Arraylist lambda 运用
Arraylist (可以问空,null,可以重复,是有序的(就是放进去和拿出来是有序的,),线程不安全(如果有1个公共的ArrayLIst对象,2个线程同时访问的话,如果都修改的话,就会有不安全,如果每个线程都new的对象,那就不存在线程不安全。所以我们可以ThreadLocal,定义每个线程都有自己的ArrayList对象,))
底层是用数组实现的。如果new ArrayList();默认初始数组长度是10,
如果添加的元素大于10的,他会自动去扩容grow,扩容机制是 oldCapacity +(oldCapacity>>1) ,就是 oldCapacity*1.5,里面用到Arrays.copyOf(原来数组,新数组长度)
list的长度就是实际的size
add(E e) 方法 ,先判断是否要扩容,数组最大长度是Integer.MAX_VALUE
然后让 类里面的elementData[size++] = e
add(int index,E e) 方法
先判断index是否有没有越界 rangeCheckForAdd(index)
在进行扩容 ensureCapacityInternal(size + 1);
然后用系统的数组复制 System.arraycopy(elementData, index, elementData, index + 1,size - index); 参数1. 原来数组,2 原来数组要复制的起始位置,3目标数组,4,目前数组的开始位置,5 复制的长度
然后复值 elementData[index] = e;
长度加+1 size++;
get(int index) 方法
先判断索引下标有没有越界
根据索引下标获取数组里面的值
set(int index, E e) 替换原先这个下标的数组的值
remove(int index) 根据下标删除对应的值,如果删除的是不是最后一个,进行了数组的重新copy
但是这边删除元素,最好用iterator 来remove,如果连续删除2个元素
比如 list.remove(1); list.remove(2), 这样其实是删除下表示 1,和3 的元素,因为 在删除1的时候,数组有重新复制新的。然后删除2个时候其实是原来3的下标
还有1中情况,比如用iterator 去循环的时候,用list.remove的话,这样会报错 ConcurrentModificationException ,因为在list的任何操作的时候对 modCount 进行处理,然后在 it里面会去判断 这个是是否等于expectedModCount,如果不等的话,就报错
clear() 把所有的元素清空。
modCount 这个东西,每次对list 添加,删除 都会给这个值加1,下面代码就会报错。
看下面图,这边就报错。 因为 我在获取 迭代器之后,还对list进行了add操作,这样 在循环的时候就会去比较 modCount 和 expectedModCount ,如果不等的话,就报错错。
***************************lambda**********************
如果用lambda 来处理ArrayList
foreach
实现的方式:
定义一个接口里面就一个方法。
然后在一个main方法里面
这类似就是foreach
2 stream的用法
第1个list2 里面是方法里,因为map 里面有返回值,所以要有return
其他的 是因为就一句话,没有{} 这个,所以不姚renturn,类似于做一下计算。
map 类似做一下运算之后
filter 过滤一下集合,其实2个感觉是一样的。
removeif 方法
这个是删除里面包含2的
sort方法
这边参数是2个,因为sort 里面 Comparator 的compare的方法,其实Comparator 里面也有equals方法,为什么不要实现呢,因为所有类都继承object方法。Object都实现了。