写点什么

Java 中常见集合类核心源码阅读

作者:(-0 , +0)
  • 2023-05-15
    江西
  • 本文字数:3142 字

    阅读完需:约 10 分钟

Java 中常见的集合类主要有 List、Set 和 Map。这些集合类使用广泛,因此深入了解它们的实现原理非常重要。在 Java 的集合类中,最常用的是 ArrayList、LinkedList、HashSet 和 HashMap,这些集合类的实现基本都依赖于数组和链表。


一、ArrayList 源码


ArrayList 是 Java 中最常用的集合类之一,它底层使用数组实现,它的查询效率比 LinkedList 高。在 ArrayList 中,随机访问元素的时间复杂度为 O(1),增加或删除元素的时间复杂度为 O(n)。


在 Java 8 版本中,ArrayList 的源码中有一些新的方法,比如 spliterator(),用于提供集合的可分割性和遍历性。另外,还有 sort()和 replaceAll()方法,用于对集合进行排序和替换元素。


下面是 ArrayList 的部分源代码,用于展示 ArrayList 的实现原理。


public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {    /**     * 默认的初始化数组容量大小     */    private static final int DEFAULT_CAPACITY = 10;
/** * 元素实际数量 */ private int size;
/** * 存放元素的数组 */ private Object[] elementData;
/** * ArrayList默认构造函数 */ public ArrayList() { this.elementData = new Object[DEFAULT_CAPACITY]; }
/** * ArrayList带初始化大小的构造函数 */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = new Object[]{}; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
/** * 向ArrayList末尾添加元素 */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
/** * 返回ArrayList指定下标的元素 */ @SuppressWarnings("unchecked") public E get(int index) { rangeCheck(index);
return (E) elementData[index]; }
/** * 确保ArrayList容量足够 */ private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); }
ensureExplicitCapacity(minCapacity); }
/** * 确保ArrayList容量足够 */ private void ensureExplicitCapacity(int minCapacity) { modCount++;
if (minCapacity - elementData.length > 0) grow(minCapacity); }
/** * 扩容ArrayList大小 */ private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
/** * ArrayList迭代器 */ public Iterator<E> iterator() { return new Itr(); }
/** * 内部类Itr,ArrayList的迭代器实现 */ private class Itr implements Iterator<E> { //... }
//...}
复制代码


二、LinkedList 源码


LinkedList 是 Java 中另一个常用的集合类,它底层使用双向链表实现。在 LinkedList 中,插入和删除元素的时间复杂度为 O(1),获取元素的时间复杂度为 O(n)。


与 ArrayList 不同,LinkedList 还支持栈和队列操作,比如 poll()、offer()和 push()等方法,这些方法可以实现在集合的开头和结尾插入、删除元素。


下面是 LinkedList 的部分源代码,用于展示 LinkedList 的实现原理。


public class LinkedList<E>    extends AbstractSequentialList<E>    implements List<E>, Deque<E>, Cloneable, java.io.Serializable {    /**     * 链表长度     */    transient int size = 0;
/** * 链表头部 */ transient Node<E> first;
/** * 链表尾部 */ transient Node<E> last;
/** * 构造一个空链表 */ public LinkedList() { }
/** * 向链表头部插入元素 */ private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; }
/** * 链表中删除指定元素 */ public boolean remove(Object o) { if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }
/** * 链表从头向尾遍历元素 */ public Iterator<E> iterator() { return new ListItr(0); }
/** * 内部类ListItr,链表迭代器的实现 */ private class ListItr implements ListIterator<E> { //... }

/** * 内部类Node,链表中存储节点的实现 */ private static class Node<E> { E item; Node<E> next; Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }}
复制代码


三、HashSet 源码


HashSet 是 Java 中常用的 Set 集合类,它底层使用 HashMap 来实现。在 HashSet 中,元素的添加、删除和查找操作时间复杂度均为 O(1)。


HashSet 与 HashMap 实现的主要区别是,在 HashSet 中,添加元素是将元素添加到 HashMap 的 key 值上,value 值是一个 FINAL new object();


下面是 HashSet 的部分源代码,用于展示 HashSet 的实现原理。


public class HashSet<E>    extends AbstractSet<E>    implements Set<E>, Cloneable, java.io.Serializable {    /**     * 底层使用的HashMap实例     */    private transient HashMap<E,Object> map;
/** * 集合元素的默认值 */ private static final Object PRESENT = new Object();
/** * 构造一个空HashSet */ public HashSet() { map = new HashMap<>(); }
/** * 向HashSet中添加元素 */ public boolean add(E e) { return map.put(e, PRESENT)==null; }
/** * 返回集合的迭代器 */ public Iterator<E> iterator() { return map.keySet().iterator(); }
//...}
复制代码


发布于: 刚刚阅读数: 7
用户头像

(-0 , +0)

关注

还未添加个人签名 2018-12-27 加入

还未添加个人简介

评论

发布
暂无评论
Java中常见集合类核心源码阅读_Java_(-0 , +0)_InfoQ写作社区