集合List、Set、Map详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liyanqiang19/article/details/84965002

List、Set、Map是否继承自Collection接口?

List、Set是map不是,List是线性结构的容器,底层使用数组实现,使用于按数值索引访问元素的情形;Set存储零散的元素且不允许有重复的元素(类似数学中的集合);Map存储的是key-value键值对

阐述ArrayList、Vector、LinkedList的存储性能和特性?

共同点:ArrayList、LinkedList、Vector都是List接口的实现类,存储的数据都是有序的、可重复的。

区别:ArrayList:作为List的主要实现类;底层使用数组;效率高;线程不安全的;

为什么ArrayList线程不安全?

ArrayList在增加元素时进行两步操作,1、判断size是否能放下add的元素;2、向底层数组中添加元素;因此多个线程同时向List中添加元素会出现  数组越界的异常;或者A线程add的值覆盖了B线程add的值;

解决方法?

工具类Collections中定义 了 synchronizedList(List list)方法,将此ArrayList转化为线程安全的;以读为主的场景中使  CopyOnWriteArrayList解决线程安全问题;CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/liyanqiang19/article/details/84965002