一、深入理解-Java集合初篇
导读:
本篇文章开始我们将要开始讲解Java集合,包括List、Set、Map等,也会对HashMap做深入的讲解。通过JDK1.7和JDK1.8两个版本的源码分析一步一步引导大家理解编程思想。同时还会就JDK1.7、JDK1.8两个版本的哈希冲突解决机制、哈希扩容机制等内容做深入的讲解。本篇将先引导大家认识Java集合并就各集合之间的优缺点简单分析。
Java集合类图
Java集合框架之List
Arraylist
底层数组实现,有序,可重复,不可为空
查找快,增删慢,
非线程安全
扩容原来的1.5倍
数组中数据必须是连续的存储空间,
因此在增加或者删除时候都需要移动数组后面的内容,时间复杂度为0(n)
Vector
底层数组实现,有序,可重复,不可为空
查找快,增删慢,
线程安全—效率低
扩容原来的一倍
由于要实现线程安全因为效率较低
LinkedList
双向循环链表实现,有序,可重复
增删快,查找慢
非线程安全
无需扩容
提供了专门用于操作表头和表尾的元素,可以模拟栈、队列、双向队列使用
ArrayList与LinkedList的实现和区别
ArrayList底层是数组实现,查找快,增删慢。在随机访问或者指定indx的情况下查询速度的时间复杂度是O1;增删慢是因为,每次增加和删除数据都需要移动剩余的数据,另外在数组在初始的时候就需要指定容量,不然后期会动态扩容。
LinkedList的底层是双向链表实现,查找慢,增删快。由于需要从头或者尾部一个一个向下查找,所以时间复杂度为0n。他增删快是因为只需要改变节点中的指针即可。而且不需要动态扩容,因为是一个一个向后或者向前指向的指针;
ArrayList适合随机查找多,增删少的环境;
LinkedList适合增删多的环境;
双向链表可以模拟栈和队列。
头存头取-栈;
头存尾取-队列;
ArrayList扩容-初始默认10,如果个数大于其容量,则扩展为原来的1.5倍。
Java集合框架之Set
值不可以重复。
存储无序(存入和取出的顺序不一定相同)
对象的相等性本质是对象hashCode值(java是依据对象的内存地址计算出的序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。
HashSet
底层使用hash表-hash桶,一个hashCode下可以存放多个元素。
内部hashMap实现,
无序,
不可重复
存取速度快
TreeSet
-
二叉树实现按照-指定的序列进行排序(升序、降序),每次插入一个对象都会进行一次排序,然后插入二叉树中指定的位置。
-
Integer和String默认都使用TreeSet排序,如果要自定义排序,则必须要实现Comparable接口,然后重写compareTo()方法。
-
重写compareTo()方法时候,内部要返回一定的值才可以按照这个值进行排序。
内部使用TreeMap的SortedMap
排序存储
LinkedHashSet
HashSet+LinkedHashMap
双向链表记录插入顺序,
继承HashSet,又基于LinkedHashMap实现。
Java集合框架之 Map
HashMap
JDK1.7—》哈希表,链表
JDK1.8—》哈希表,链表,红黑树— JDK1.8之后,当链表长度超过8使用红黑树。
非线程安全
0.75的负载因子,扩容必须为原来的两倍。
默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。
Key不可重复,值可重复
Key可以为空,value也可以为空,但不可同时为空。
根据HashCode存储数据。
hashTable
哈希表
线程安全
Key不可重复,value可重复
Key和value都不可以为空
treeMap
二叉树(红黑树),可以实现一致性哈希的哈希环。
TreeMap 数据结构 key 实现Compare解耦,
TreeMap怎么实现有序的?
TreeMap是按照Key的自然顺序或者Comprator的顺序进行排序,内部是通过红黑树来实现。所以要么key所属的类实现Comparable接口,或者自定义一个实现了Comparator接口的比较器,传给TreeMap用户key的比较。
如果想继续深入学习Java集合相关内容,请关注本头条号。
如需了解更多更详细内容也可关注本人****博客:不吃_花椒