Collection和Collections的区别
特性 | Collection | Collections |
---|---|---|
类型 | 接口 | 工具类 |
功能 | 定义了集合的基本操作,表示集合对象 | 提供了静态方法,操作集合或生成集合对象 |
包位置 | java.lang | java.util |
继承关系 | 是集合框架的顶级接口 | 无继承,是个工具类 |
常用用途 | 创造集合|用于对集合进行操作(例如排序 | |
调用方式 | 通过实现实例化后调用 | 直接调用静态方法 |
Collections排序内部原理
Java1.2~Java6
算法:
- 使用合并排序(MergeSort)
特点:
- 稳定排序:相等的元素在排序后相对位置不会改变
- 时间复杂度:
• 最佳情况:O(n log n)
• 平均情况:O(n log n)
• 最差情况:O(n log n) - 空间复杂度:O(n),需要额外的临时数组存储数据
实现:
- Collections.sort 内部调用 Arrays.sort,使用归并排序对列表进行排序。
Java 7
算法:
- 使用了一种称为 TimSort 的算法(自 Java 7 开始)
特点
- 稳定排序
- 基于归并排序和插入排序的优化组合
- 时间复杂度:
• 最佳情况:O(n)(几乎有序的输入)
• 平均情况:O(n log n)
• 最差情况:O(n log n) - 空间复杂度:O(n),比原来的归并排序更节省空间
- 对几乎有序的数据具有更高的性能
实现
- Collections.sort 调用 Arrays.sort,Arrays.sort 内部切换为 TimSort 实现。
TimSort 的工作原理:
- 将数组分成若干个 run(子数组)。
- 通过插入排序对每个 run 排序。
- 将相邻的 run 合并,使用归并排序的方式优化合并。
Java 8
算法:
- Collections.sort 调用 List.sort,并使用 TimSort 算法。
特点:
- 稳定排序,和 Java 7 一致。
- 优化点:
• 引入了 Lambda 表达式的支持。
• 可以直接通过 List.sort 指定排序规则。
实现变更:
- Collections.sort 的实现改为:
public static <T extends Comparable<? super T>> void sort (List<T> list) {
list.sort(null);
}
Java 9 及以上
算法:
- 默认仍然是 TimSort,与 Java 8 相同。
特点:
- 提升了部分场景的性能,尤其是较小规模数据的排序。
- 更推荐直接使用 List.sort 方法。
改进方向:
- List.sort 提供了更现代化的 API,可以直接接受比较器,功能与 Collections.sort 一致,但更具可读性。
- 举例:
List<String> list = Arrays.asList("Banana", "Apple", "Cherry");
list.sort(String::compareTo); // 推荐使用 List.sort
List、Set、Map是否继承Collection
List、Set是,Map不是。Map是键值映射容器,List时线性结构的容器,Set存储的零散元素不允许出现重复元素
List、Set、Map之间的区别
元素有序 | 允许元素重复 | ||
---|---|---|---|
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | 否 | ||
TreeSet | 是(用二叉树排序) | ||
Map | AbstractMap | 否 | Key必须唯一,value可以重复 |
HashMap | |||
TreeMap | 是(用二叉树排序) |
HashTable与HashMap的区别
HashMap | HashTable | |
---|---|---|
允许KV的值为NULL | 是 | 否 |
是否线程安全 | 不支持,适用单线程 | 支持, 适用多线程(但现在基本都在使用CocourrentHashMap) |
fail-fast | 支持 | 不支持 |
扩容方式 | 初始16,扩容变为原来的2倍 | 初始11,扩容变为原来的2倍 + 1 |
遍历方式 | 使用Iterator遍历器,支持for-each循环 | 使用 Enumeration 和 Iterator 两种方式遍历,但推荐使用迭代器(Iterator,也支持for-each循环 |
底层数据结构 | 同步的哈希表结构 | JDK1.8之后引入了红黑树 |
HashMap和TreeMap之间如何选型
- 插入、删除、定位元素,推荐使用HashMap
- 如果是要有序遍历Key,推荐使用TreeMap
ArrayList和LinkedList区别
ArrayList | LinkedList | |
---|---|---|
底层数据结构实现 | 动态数组 | 双向链表 |
内存使用 | 连续内存访问,内存开销小 | 每个节点包含数据、指针,内存开销大 |
随机访问性 | O(1) | O(n) |
插入和删除 | O(n) | O(1) |
尾部插入数据 | 平均 O(1)(需要扩容时为 O(n)) | O(1) |
遍历性能 | 高效(顺序存储,CPU 缓存友好) | 较低(链表指针跳转,非连续存储) |
线程安全性 | 线程不安全,需要手动同步 |
ArrayList和Vector区别
ArrayList | Vector | |
---|---|---|
底层数据结构实现 | 动态数组 所以动态数组有的优势 他两都有 | |
迭代器fail-fast | 支持 | |
线程安全性 | 线程不安全,需要手动同步 | 线程安全,全系方法标配synchronized修饰符 |
性能 | 加锁的原因,性能差 | 无锁机制,性能更强 |
扩容 | 2倍 | 1.5倍 |
Array和ArrayList区别
ArrayList | Vector | |
---|---|---|
数据类型 | 对象特化数组,仅支持存储对象 | 基本数据类型 + 对象数据 |
存储数据大小 | 可扩容 | 固定大小 |
内置方法 | 丰富(addAll、removeAll、iteration) | 贫瘠 |
Queue的poll和remove区别
- 相同点:都是返回第一个元素,并在队列中删除返回的对象
- 不同点:如果队列的第一个元素为空,poll会返回null,remove会抛出异常
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。