Collection和Collections的区别

特性CollectionCollections
类型接口工具类
功能定义了集合的基本操作,表示集合对象提供了静态方法,操作集合或生成集合对象
包位置java.langjava.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 的工作原理:

      1. 将数组分成若干个 run(子数组)。
      2. 通过插入排序对每个 run 排序。
      3. 将相邻的 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会抛出异常

爱跑步的猕猴桃
1 声望0 粉丝