跳至主要內容
HashMap 源码分析:数据结构
本文内容

本文来源 bugstack,加上了自己的理解!

1. 介绍

HashMap 最早出现在 JDK 1.2 中,主要用于存放键值对(key-value),底层基于散列算法实现,是 线程不安全的


AruNi_Lu大约 15 分钟Java集合
ArrayList 源码分析
本文内容

1. 介绍

ArrayList = Array + List,即数组 + 列表,它的底层是通过 数组 实现的,不过这个数组不像普通的数组,它可以在插入元素时按需进行 动态扩容

2. 源码分析

2.1 初始化

先把初始化有关的源码搬出来:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    /**
     * 默认初始容量大小
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 空数组(用于空实例)。
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

    // 用于默认大小空实例的共享空数组实例。
    // 我们将其与 EMPTY_ELEMENTDATA 区分开来,以知道在添加第一个元素时容量需要增加多少。
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

    /**
     * 保存 ArrayList 数据的数组
     */
    transient Object[] elementData; // non-private to simplify nested class access

   /**
     * ArrayList 所包含的元素个数
     */
    private int size;

    /**
     * 带初始容量参数的构造函数(用户可以在创建 ArrayList 对象时自己指定集合的初始大小)
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    /**
     * 默认无参构造函数:构造一个初始化容量为 10 的空列表,当添加第一个元素的时候数组容量才变成 10
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    /**
     * 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。
     */
    public ArrayList(Collection<? extends E> c) {
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }
    
    /**
     * 修改 ArrayList 实例的容量为列表的当前大小,此操作可最大程度地减少 ArrayList 实例的存储空间。
     */
    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }
    
    // ......
}

AruNi_Lu大约 10 分钟Java集合
集合入门
本文内容

1. 集合概念

Java 集合框架主要包括两种类型的容器:

  • 集合(Collection),存储一个元素集合;
  • 图(Map),存储键/值对映射。

Collection 接口又有 3 种子接口类型分别为 List、Set 和 Queue,再下面是一些子接口和实现类。

Map 接口下有常见的 HashMap、Hashtable 实现类,以及SortedMap 子接口。


AruNi_Lu大约 16 分钟Java集合