1、集合体系:如下图
2.ArrarList 和 LinkedList
(1).ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。
(2).对于随机访问 get 和 set,ArrayList 效率优于 LinkedList,因为 LinkedList 要移动指针。
(3).对于新增和删除操作 add 和 remove,LinkedList 比较占优势,因为 ArrayList 要 移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList 的速度反而优于 LinkedList。但若是批量随机的插入删除数据,LinkedList 的速度大大优于ArrayList. 因为 ArrayList每插入一条数据,要移动插入点及之后的所有数据。
3.HashMap底层是数组+链表+红黑树,这几类结构的作用
(1).数组 Node[] table ,哈希表,根据对象的 key 的 hash 值进行在数组里面是 哪个节点。
(2).链表的作用是解决 hash 冲突,将 hash 值取模之后的对象存在一个链表放在 hash 值对应的槽。
(3).红黑树 JDK8 使用红黑树来替代超过 8 个节点的链表,主要是查询性能的提升, 从原来的 O(n)到 O(logn)。
(4).通过 hash 碰撞,让 HashMap 不断产生碰撞,那么相同的 key 的位置的链表就会不断增长,当对这个 Hashmap 的相应位置进行查询的时候,就会循环遍历这个超级大的链表,性能就会下降,所以改用红黑树。
4.HashMap 和 HashTable 区别
(1).线程安全性不同
HashMap 是线程不安全的,HashTable 是线程安全的,其中的方法是 Synchronized,在多线程并发的情况下,可以直接使用 HashTable,但是使用 HashMap 时必须自己增加同步处理。
(2).是否提供 contains方法
HashMap 只有 containsValue 和 containsKey 方法;HashTable 有 contains、 containsKey 和 containsValue 三个方法,其中 contains 和 containsValue 方法功 能相同。
(3).key和 value是否允许null值
Hashtable 中,key 和 value 都不允许出现 null 值。HashMap 中,null 可以作为 键,这样的键只有一个;可以有一个或多个键所对应的值为 null
(4).数组初始化和扩容机制
HashTable 在不指定容量的情况下的默认容量为 11,而 HashMap 为 16, Hashtable 不要求底层数组的容量一定要为 2 的整数次幂,而 HashMap 则要求一 定为 2 的整数次幂