Java集合
1.常用集合类依赖图
使用idea生成类依赖图,点击类Ctrl+Alt+Shift+U,在按空格添加其他类
线程安全的:HashTable、ConcurrentHashMap、Vector、stack
线程不安全的:HashMap、ArrayList、LinkedList、HashSet、TreeSet、TreeMap
2.LinkedList源码解读
成员变量
transient int size = 0;
//指向第一个元素
transient Node<E> first;
//指向最后一个元素
transient Node<E> last;
add(E)
将指定的元素追加到此列表的末尾。这个方法等价于 addLast.
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
// 获取链表的最后一个节点
final Node<E> l = last;
// 创建一个新的节点,它的前一个节点是l,元素是e,下一个节点是null(因为它将成为最后一个节点)
final Node<E> newNode = new Node<>(l, e, null);
// 将链表的最后一个节点更新为新创建的节点
last = newNode;
// 如果l为null,说明链表是空的,所以新节点同时也是第一个节点
if (l == null)
first = newNode;
else
// 如果l不为null,那么将l的下一个节点设置为新节点
l.next = newNode;
// 链表的大小增加1
size++;
// 修改计数器增加1,这个计数器用于追踪链表的结构修改次数
modCount++;
}
add(int, E)
将指定元素插入此列表中的指定位置。将当前在该位置的元素(如果有的话)和任何后续元素向右移动(在它们的索引上加1)。
add(Collection<? extends E> c)
按照指定集合的选代器返回的顺序,将指定集合中的所有元素追加到该列表的末尾。如果在操作进行期间修改了指定的集合,则此操作的行为是未定义的。(注意,如果指定的集合是这个列表,并且它是非空的,则会发生这种情况。)
addFirst(E)
在此列表的开头插入指定的元素
public void addFirst(E e) {
linkFirst(e);
}
private void linkFirst(E e) {
// 获取链表的第一个节点
final Node<E> f = first;
// 创建一个新的节点,它的前一个节点是null(因为它将成为第一个节点),元素是e,下一个节点是f
final Node<E> newNode = new Node<>(null, e, f);
// 将链表的第一个节点更新为新创建的节点
first = newNode;
// 如果f为null,说明链表是空的,所以新节点同时也是最后一个节点
if (f == null)
last = newNode;
else
// 如果f不为null,那么将f的前一个节点设置为新节点
f.prev = newNode;
// 链表的大小增加1
size++;
// 修改计数器增加1,这个计数器用于追踪链表的结构修改次数
modCount++;
}
addLast(E)
将指定的元素追加到此列表的末尾。
public void addLast(E e) {
linkLast(e);
}
可以进行队列操作/栈操作
| 方法 | 解释 |
|---|---|
peek() | 检索头部元素、但不删除 |
push(E) | 入栈、头部添加元素 |
pop() | 出栈、头部删除元素,并返回该元素 |
add(E) | 尾部添加元素 |
poll() | 删除头部元素,并返回该元素 |