List/Set/Map的区别?
- List是一种有序、可重复,有索引的单列集合
- Set是一种无序、不可重复,无索引的单列集合
- Map是双列集合,存放键值对
Arraylist与LinkedList区别?
ArrayList
是基于数组实现的动态数组,在访问数据时具有较好的性能,但在插入、删除元素时需要移动其他元素,因此增删性能较差
LinkedList
的实现是基于双向链表,在插入、删除元素时可以直接修改链表节点的引用,因此性能比ArrayList
更好。但在访问数据方面,由于需要遍历链表才能找到指定位置的元素,因此查改性能较差
迭代器Iterator是什么?
迭代器主要是用来遍历集合用的,它的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException
异常
快速失败机制?
集合的快速失败机制是通过在集合对象内部维护一个计数器modCount,当集合发生结构性修改时,modCount的值会自增,迭代器在每次迭代时都会检查modCount是否发生变化,如果变化了,就抛出ConcurrentModificationException异常来防止数据不一致的问题。但这种机制只能用于检测并发修改导致的问题,并不能保证所有的并发错误都能被检测到,因此需要采取其他措施来确保线程安全
安全失败机制?
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历
HashMap加载因子为何是0.75?
这个值是经过实验验证得到的一个比较合理的值,它能在保证性能的同时尽可能减少哈希冲突的发生。如果加载因子太小,则会浪费空间;如果加载因子太大,则会导致哈希冲突增多,影响查找效率
哈希表的大小设置为2的幂次方?
因为在计算元素在哈希表中位置时,可以使用位运算来代替除法运算,提高计算速度。同时,这也可以使得哈希表的负载因子保持在较小的范围内,减少哈希冲突的可能性,提高哈希表的性能和效率
HashMap的扩容过程?
HashMap在存储一定数量的元素后,会自动扩容以保证哈希表的负载因子不超过一个给定的阈值。扩容过程就是将原来的哈希表大小翻倍,并重新计算每个元素在新哈希表中的位置,再将所有元素重新插入到新哈希表中。虽然这个过程比较耗费时间和计算资源,但可以保证哈希表的性能和效率,并避免哈希表溢出的问题
红黑树的特点?
红黑树是一种自平衡二叉查找树,它具有以下特点:
- 每个节点都是红色或黑色
- 根节点是黑色的
- 所有叶子节点都是黑色的空节点(NIL节点)
- 如果一个节点是红色的,则它的两个子节点都是黑色的
- 对于任意节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点
这些特点确保了红黑树的平衡性和高效性。由于每个节点到其任何一个后代叶子节点的路径中黑色节点的数目相同,因此在最坏情况下,红黑树可以保证查找、插入和删除操作的时间复杂度为O(log n)。同时,通过对节点颜色的限制,红黑树能够保持近似平衡状态,不会像普通的二叉查找树那样出现退化成链式结构的情况
Collection与Collections的区别?
Collection
是Java集合框架中的基本接口Collections
是Java集合框架提供的一个工具类