在总结集合之前,我们可能还会想起数组,那么数组和集合有什么区别呢?
Collestion和Array的区别:
image.png
接下来重点放在Collection的学习和总结上:
Collection和Map集合的常用分类
image.pngList和Set的区别:
image.pngList的子类:
ArrayList:
底层结构是动态数组,查找速度快,增删速度慢,线程不安全,效率高,可以存重复元素。
LinkedList:
底层结果是链表,查找速度慢,增删速度快,线程不安全,效率高,可以存重复元素。
Vector:
底层结构是动态数组,查找速度快,增删速度慢,线程安全,效率低,可以存重复元素。
通过对方法加上synchronized的关键字实现线程安全,效率因此也比较低。
在多线程的情况,不能直接使用ArrayList,除了使用Vector之外,还可以同过下面的两种方式实现线程安全,详情可以参考ArrayList的实现原理以及实现线程安全:
- Collections.synchronizedList(List list)函数返回一个线程安全的ArrayList集合
- 使用concurrent并发包下的CopyOnWriteArrayList的。
ArrayList和LinkedList的区别和使用场景:
区别:
ArrayList的底层结构是动态数组,使用的内存是连续的,在查找的速度比LinkedList的速度快,但是增删的速度慢。
LinkedList的底层结构是链表,使用的内存是不连续的,在查找的速度比ArrayList慢,但是增删的速度快。
使用场景:
因为ArrayList和LinkedList都是线程不安全的,所以它们不能应用于多线程并发的情况,ArrayList适合在查找比较多的单线程的业务中,LinkedList适合在增删操作比较多的单线程的业务中
set的子类
HashSet
HashSet的底层是通过哈希表实现的,元素唯一且无序,可以存入null,但是只能是一个,线程不安全,效率高,元素的唯一性事通过重写hashCode()和equals()方法来保证元素的唯一的,否则不能实现元素的唯一性。
TreeSet
TreeSet的底层是根据二叉树实现的,元素唯一且有序,不可以放入null的值,唯一性同样需要重写hashCode()和equals()来实现,二叉树的结构保证了元素的有序性。
LinkedHashSet
LinkedHashSet的底层结构是通过链表和哈希表实现的,链表实现元素的顺序跟插入顺序一致,哈希表保证了元素的唯一性
Map集合总结
Map是一种具有映射关系的集合,通过键值对来存储,key和value都可以是任何数据类型,但是key是不能重复的,因此可以通过指定的key来获取Value。
HashMap
HashMap的是线程不安全的,底层结构是数组和链表实现的,key和value可以为null,但是key只能出现一次,不能有重复的key,Value可以出现多次,HashMap的性能是最高的。用作做key的对象必须要重写hashCode()和equals()的方法,不能保证键值对的顺序,尽量不要使用哈希值会变得对象作为key。底层原理实现可参考HashMap的底层结构和实现原理
HashTable
HashTable是线程安全的,HashTable的方法通过Sychronized关键字实现同步,不能存入空的键值对,HashTable的性能是最差的,用作做key的对象必须要重写hashCode()和equals()的方法,不能保证键值对的顺序,尽量不要使用哈希值会变得对象作为key。
TreeMap
TreeMap的底层结构是红黑树,通过红黑树对Key进行排序,排序方式有自然排序和定制排序,TreeMap的key是通过TreeSet的形式存储的,对Key的要求于TreeSet的要求一致。详情可参考TreeMap原理实现及常用方法.
参考链接:
https://blog.csdn.net/feiyanaffection/article/details/81394745
网友评论