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都实现了。

 

posted @ 2018-04-09 16:14  tangw  阅读(867)  评论(0编辑  收藏  举报