从整体说下集合
首先集合分为Collection、Map两大块, 前者每个位置只能保存一个元素,后者可以保存两个元素。
Collection又可分为List、Set、Queue
List下常用的有ArrayList、LinkedList、Vector、Stack
Set下常用的有HashSet、TreeSet
Queue又有Deque、Stack、LinkedList
看图更直观
Collection 继承体系
Map 继承体系
大的区别
提供这么多的集合类,总的来说也就是为了实现不同的功能,比如Set元素不能重复,List可以重复,Queue先进先出,不允许随机访问队列中的元素,Map含健值对,每个里面又可以再细分一些类可以排序,或支持并发等。
像LinkedList实现了List和Queue,既能作为先进先出队列,又能作为双端队列,还具备栈的能力。
LinkedHashSet继承HashSet,ArrayDeque实现Queue,用数组实现双端队列。
Stack 基于 Vector 实现。TreeSet 基于 TreeMap 实现,支持排序。
挑几个细说
HashMap
1.初始化. 默认16,如果指定容量的话,内部会自动调整为大于或等于指定容量的最小的一个2的倍数,比如指定10,会给16.
2.扩容. 非线程安全,扩容可能有并发问题,扩容会发生reHash,即会先将新的hash表设置为旧的hash表容量的2倍,再将旧的hash表的元素迁移过去,发生冲突时采用头插法形成链表,这样的设计思路是新数据默认更热,然后删除旧的hash表,再重新新建一个新的hash表以备下次使用。扩容可能产生链表环,jdk1.8之后有改进,改用尾插法加红黑树。
3.为什么容量得是2的倍数呢,因为是2的倍数时,我们查找一个元素时,hashCode%容量可以简化为一个与操作,h%length==h&(length-1),执行效率好,而且是2的倍数的话length-1二进制都为1,进行与操作得到的位置会比较均匀,发生hash碰撞的几率小。
Queue
Queue的使用一般用offer和poll,而不是add和remove,因为后者其实调用了前者,但是后者会在失败的时候抛出异常,这个在AbstractQueue里面体现的。还有put,take两种,放和取,当队列满或空的时候会阻塞。
TreeMap
这个map实现了SortedMap,默认对key升序排列,也可以自己指定规则,基于红黑树实现。
红黑数又是基于二叉查找树来的,因为二叉查找树有大长腿问题,所以在上面定义了一些红色节点、黑色节点和一些规则,在路径比较长的时候可以通过一定的旋转达到最长路径比较短的一个效果。保证最长路径不超过最短路径的2倍长。
LinkedHashMap
继承HashMap,但是它重新定义了Entry,在它的基础上加入before和after两个属性,所以它可以记录元素添加的顺序,默认可以按元素添加的顺序输出。而且当accessOrder属性初始化指定为ture的话也可以记录元素的访问顺序,即每次访问后会将被访问的元素移动到链表的尾部,这个特性就可以来做LRU缓存。
欢迎工作一到五年的Java程序员朋友们加入Java架构交流:810589193
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
网友评论