返回

从源码视角透析ArrayList、LinkedList和HashMap

见解分享

  1. ArrayList

ArrayList是一种基于数组的数据结构,它允许动态调整大小。我们可以通过索引来访问ArrayList中的元素,索引从0开始。

1.1 原理与实现

ArrayList内部使用了一个数组来存储元素,当我们需要添加或删除元素时,ArrayList会自动调整数组的大小。如果数组已满,ArrayList会创建一个更大的数组,并将元素复制到新数组中。如果数组中还有很多空余空间,ArrayList会缩小数组的大小,以节省内存空间。

1.2 常用操作的复杂度

  • 查找:O(1)
  • 插入:O(1)(如果数组中有足够的空间,否则为O(n))
  • 删除:O(n)
  • 遍历:O(n)

2. LinkedList

LinkedList是一种基于链表的数据结构,它允许在列表中的任何位置添加或删除元素。LinkedList中的元素通过指针连接起来,每个元素都包含一个指向下一个元素的指针。

2.1 原理与实现

LinkedList内部使用一个双向链表来存储元素。双向链表中的每个元素都包含一个指向下一个元素的指针和一个指向前一个元素的指针。当我们需要添加或删除元素时,LinkedList会通过调整指针来完成操作。

2.2 常用操作的复杂度

  • 查找:O(n)
  • 插入:O(1)
  • 删除:O(1)
  • 遍历:O(n)

3. HashMap

HashMap是一种基于哈希表的映射数据结构,它允许通过键来快速查找值。HashMap的实现基于数组和链表。数组中的每个元素都是一个链表,链表中的元素是键值对。

3.1 原理与实现

当我们需要向HashMap中添加一个键值对时,HashMap会计算键的哈希值,然后将键值对添加到哈希值对应的链表中。当我们需要查找一个值时,HashMap会计算键的哈希值,然后在哈希值对应的链表中查找该值。

3.2 常用操作的复杂度

  • 查找:O(1)(平均情况下)
  • 插入:O(1)(平均情况下)
  • 删除:O(1)(平均情况下)
  • 遍历:O(n)

4. 总结

ArrayList、LinkedList和HashMap都是Java中常用的数据结构,它们それぞれ具有不同的特点和适用场景。ArrayList适用于需要快速随机访问元素的场景,LinkedList适用于需要频繁插入或删除元素的场景,HashMap适用于需要通过键快速查找值的场景。