目录
CopyOnWriteArrayList——和Vector不同且推荐使用

- 特点:元素有序,且可重复
- 遍历方式:下标,foreach,迭代器
- 扩容方式:初始容量为10,负载因子为0.5,扩容增量为0.5倍
- 新容量 = 原容量 + 原容量 * 0.5 , 如 ArrayList的容量为10,一次扩容后是容量为15
特点:1.简单数据结构,超出容量自动扩容,动态数组
2.内部实现是基于基础的对象数组的
3.随机访问快
- 弊端:1.不适合随机增加和删除
2.线程不安全
- 常用方法:1.add
2.remove
- 特点:1.LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
2.以双向链表实现,链表无容量限制,允许元素为null
3.适合做随机的增加或删除
- 弊端:线程不安全
- 常用方法:1.LinkedList可被用作堆栈(stack)【包括了push,pop方法】
2.队列(queue)或双向队列(deque)
- 特点:线程安全
- 弊端:安全性能慢,所有不建议使用
举个为什么不用的例子:假如一个厕所有3个坑,然后你一个人进去,把门关了,一个人占了3个坑,其他的不同就浪费,等你上完厕所再出去,就相当于你运行完了之后,再开大门
- 特点:1.写时复制和Vector差不多,但是有一点不一样下面解释
2.线程安全
3.适用于读多写少的场景
4.和Vector相比,性能高
5.写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值 给array
不同点--举个例子:在读取的时候,会自动复制一份,然后给它自己使用,这样
就不会浪费资源且不会影响性能,自己写自己的,然后复制的这一份,最终在
复制的这一份完成后,就统一使用复制的这一份,之前那一份就不用了,是 不是不占资源
6.最终一致性
7.实现了List接口,使用方式与ArrayList类似
数据准备:为方便演示,需要有紧挨在一起的两个或多个相同的元素
List<Integer> list=new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.add(3); list.add(4);1.下列代码错误,为啥?
public void remove01(){ for(int i=0;i<list.size();i++){ if(list.get(i)==3) list.remove(i); } }错误分析:1.不能删除挨在一起的重复值,原因指定的值被删掉之后,下一个就会第上去代替被删掉的值的下表,然后i++就放下判断了,就像上面的例子,3被删了之后,然后第二个3
就第上去,代替原来的3的下表,然后系统就接着查下标为4的值了。
2.下列代码正确,对上个代码的优化。
public void remove01(){ for(int i=0;i<list.size();i++){ if(list.get(i)==3) list.remove(i--); } }分析:i--这样就可以继续判断代替的3这个值的下标。
3.下列代码正确,对上上个代码的优化。
public void remove01(){ for(int i=0;i<list.size();i++){ if(list.get(i)==3) list.remove(i--); } }4.下列代码错误,为啥?
public void remove01(){ for(Integer i:list){ if(i==3) list.remove(i); } }错误分析:代码中的i指的是下标,所有此代码中的 i=3
5.下列代码正确,为啥?
Iterator<Integer> it=list.iterator(); while(it.hasNext()){ if(it.next()==3){ it.remove(); } }分析:使用的list集合中的迭代器的hasNext来获取下一个值,就可以删掉重复的值,知道删除完为止。
6.下列代码错误,为啥?
Iterator<Integer> it=list.iterator(); while(it.hasNext()){ Integer value=it.next(); if(value==3){ list.remove(value); } }分析:用的是迭代器方法,但是没有用迭代器的删除方法。
7.下列代码错误,为啥?
list.remove(2)分析:不能删掉3这个值,原因是2表示为下标,如果为字符串就直接上掉2这个内容
list.remove(Integer.valueOf(2)); syso(list);
分析:这个删掉的是一个对象,就相当于直接删掉了2这个值,而不是下标。
- 特点:元素无序(意思就是你放进去的数据顺序和读取出来的数据顺序不一样),且不可重复
- 遍历方式:foreach,迭代器
- 扩容方式:初始容量为16,负载因子为0.75,扩容增量为1倍
- 新容量 = 原容量 + 原容量 * 0.75
数据准备:为方便演示,需要有紧挨在一起的两个或多个相同的元素
调用去重的方法:
结果:
- 特点:1.它存储唯一元素并允许空值,能依据对象的hashcode来确定该元素是否存在
2.由HashMap支持
- 弊端:1.不保持插入顺序
2.非线程安全