一、有图有真相
1、数组和集合的比较
数组不是面向对象的,有很大缺陷,而集合则可以弥补数组的缺点,且比数组更灵活好用,不同主要如下:
1:数组能存放基本数据类型和对象,而集合类存放的都是引用类型,而非对象本身
2:数组无法动态改变,而集合类容量则可以动态改变。
3:数组无法判断其中实际存有多少元素,length属性是数组的容量,而集合的size()方法可以确切返回元素的个数
4:集合有多种实现方式和不同适用场合,而数组仅采用了顺序表方式
5:集合以类的形式存在,有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了程序的开发效率
2、Collection集合详解
3、集合分类
Collection 接口的接口 对象的集合(单列集合)
|
├—-List 接口:元素按进入先后有序保存,可重复
│——├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│——├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│——└ Vector 接口实现类 数组, 同步, 线程安全
│ ——–└ Stack 是Vector类的实现类
└—Set 接口: 仅接收一次,不可重复,并做内部排序
├——└HashSet 使用hash表(数组)存储元素
│———└ LinkedHashSet 链表维护元素的插入次序
└ —–TreeSet 底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
├—Hashtable 接口实现类, 同步, 线程安全
├—HashMap 接口实现类 ,没有同步, 线程不安全-
│——├ LinkedHashMap 双向链表和哈希表实现
│——└ WeakHashMap
├—–TreeMap 红黑树对所有的key进行排序
└—IdentifyHashMap
二、List vs Set
1、list与set集合区别
1.List中提供索引的方式来添加元素和获取元素,而Set并不提供。由此可见List集合可是达到精确的存储和获取,而Set只能一个一个的比较,显然效率和实用性是比不上List集合的
2.List集合是有序存储,Set集合是无序存储。这里的有序和无序针对的是存储地址来说的。
3.List可以存储重复的值,Set不可以存储重复的值
三、Map集合详解
1、Map集合特点
1.将键映射到值的对象
2.一个映射不能包含重复的键
3.每个键最多只能映射到一个值
2、常用方法
四、CopyOnWriteArrayList集合详解
1、产生原因
1、正如ConcurrentHashMap代替SynchronizedMap一样,在这里替代Vector和SynchronizedList。(此两者锁的力度大导致效率低,切在遍历的时候无法编辑)
2、Copy-On-Write并发容器还包括CopyOnWriteArraySet,用来替代同步Set
2、使用场景
读多写少 - 便利操作远多于增删改操作
3、原理
创建新副本进行读写分离(线程安全,内部有一个ReentrantLock锁)。即迭代时就会创建一个副本,如果有增删改操作就去副本中进行操作,
而迭代则继续在此集合中进行,也就是原集合不会改变,各种操作都在副本中进行(你操作你的,我迭代我的)。等迭代完成后将集合指针
修改为指向副本地址即可完成修改。
4、缺点
1、数据一致性问题:只能保证最终一致性,如想要修改后数据马上生效请不要用
2、内存占用问题:因为要创建一个副本,所以需要多开辟一个空间来存数据