List集合就这么简单【源码剖析】(一)

简介: 笔记

前言


声明,本文用得是jdk1.8

前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识。

现在这篇主要讲List集合的三个子类:

  • ArrayList
  • 底层数据结构是数组。线程不安全
  • LinkedList
  • 底层数据结构是链表。线程不安全
  • Vector
  • 底层数据结构是数组。线程安全

这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~

看这篇文章之前最好是有点数据结构的基础:Java实现单向链表栈和队列就是这么简单二叉树就这么简单

1.jpg2.jpg

当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~


一、ArrayList解析



3.jpg

首先,我们来讲解的是ArrayList集合,它是我们用得非常非常多的一个集合~

首先,我们来看一下ArrayList的属性:

4.jpg

根据上面我们可以清晰的发现:ArrayList底层其实就是一个数组,ArrayList中有扩容这么一个概念,正因为它扩容,所以它能够实现“动态”增长


1.2构造方法


我们来看看构造方法来印证我们上面说得对不对:

5.jpg

1.3Add方法

add方法可以说是ArrayList比较重要的方法了,我们来总览一下:

6.jpg

1.3.1add(E e)

步骤:

  • 检查是否需要扩容
  • 插入元素

首先,我们来看看这个方法:

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

该方法很短,我们可以根据方法名就猜到他是干了什么:

  • 确认list容量,尝试容量加1,看看有无必要
  • 添加元素

接下来我们来看看这个小容量(+1)是否满足我们的需求:

7.jpg

随后调用ensureExplicitCapacity()来确定明确的容量,我们也来看看这个方法是怎么实现的:

8.jpg

所以,接下来看看grow()是怎么实现的~

9.jpg

进去看copyOf()方法:

10.jpg

到目前为止,我们就可以知道add(E e)的基本实现了:

  • 首先去检查一下数组的容量是否足够
  • 扩容到原来的1.5倍
  • 第一次扩容后,如果容量还是小于minCapacity,就将容量扩充为minCapacity。
  • 足够:直接添加
  • 不足够:扩容


1.3.2add(int index, E element)


步骤:

  • 检查角标
  • 空间检查,如果有需要进行扩容
  • 插入元素

我们来看看插入的实现:

11.jpg

我们发现,与扩容相关ArrayList的add方法底层其实都是arraycopy()来实现的

看到arraycopy(),我们可以发现:该方法是由C/C++来编写的,并不是由Java实现:

12.png

总的来说:arraycopy()还是比较可靠高效的一个方法。

参考R大回答:https://www.zhihu.com/question/53749473


1.4 get方法


  • 检查角标
  • 返回元素

13.jpg

// 检查角标
   private void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
    // 返回元素
    E elementData(int index) {
        return (E) elementData[index];
    }


1.5 set方法


步骤:

  • 检查角标
  • 替代元素
  • 返回旧值

14.jpg


1.6remove方法


步骤:

  • 检查角标
  • 删除元素
  • 计算出需要移动的个数,并移动
  • 设置为null,让Gc回收

15.jpg

目录
相关文章
|
22天前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
20天前
|
安全
List集合特有功能
List集合特有功能
25 2
|
22天前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
28天前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
28天前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List
|
28天前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
12天前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
25 5
|
24天前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
List集合的实现类
List集合的实现类
|
1月前
|
索引