Java基础(3)

60 阅读3分钟

Java集合

1.常用集合类依赖图

image-20240611154507686

image-20240611154530247

使用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()删除头部元素,并返回该元素