大约 16 分钟
本文内容
本文来源 bugstack,加上了自己的理解!
1. 介绍
HashMap 最早出现在 JDK 1.2 中,主要用于存放键值对(key-value),底层基于散列算法实现,是 线程不安全的。
大约 15 分钟
本文内容
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);
}
}
// ......
}
大约 10 分钟
本文内容
1. 集合概念
Java 集合框架主要包括两种类型的容器:
- 集合(Collection),存储一个元素集合;
- 图(Map),存储键/值对映射。
Collection 接口又有 3 种子接口类型分别为 List、Set 和 Queue,再下面是一些子接口和实现类。
Map 接口下有常见的 HashMap、Hashtable 实现类,以及SortedMap 子接口。
大约 16 分钟