史上最全的Java容器集合之Vector和LinkedList(源码解读)(下)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 前言文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在

手撕一个简单的队列

我们知道队列它的底层可以是数组或者是链表, 我们今天就用数组来实现一个简单的队列

package com.atguigu.ct.producer.controller;
/**
 * 六脉神剑
 * 1.使用数组实现队列功能,使用int数组保存数据特点:先进先出,后进后出
 */
public class QueueTest1 {
    public static void main(String[] args){
        //测试队列
        System.out.println("测试队列");
        Queue queue = new Queue();
        queue.in("六脉神剑");
        queue.in("七卖神剑");
        queue.in("八面玲珑");
        System.out.println(queue.out());
        System.out.println(queue.out());
    }
}
//使用数组定义一个队列
class Queue {
    String[] a = new String[5];
    int i = 1; //数组下标
    //入队
    public void in(String m){
        a[i++] = m;
    }
    //出队
    public String out(){
        int index = 0;
        String temp = a[1];
        for(int j=1;j<i;j++){
            a[j-1] = a[j];
            index++;
        }
        i = index;
        return temp;
    }
}
复制代码


结果

测试队列
六脉神剑
七卖神剑
Process finished with exit code 0
复制代码

其实很简单 就是每次出来的时候 把所有的元素的下标往前移一位。队列深入,这边就不深入了,靠各位大佬自己了,我也是黄婆卖瓜。接下来我们讲LinkedList


LinkedList 常量

三个常量 一个表示这个集合的大小,一个表示队列的元素的前一个元素,一个表示队列元素的后一个元素


来看一个Node 元素 它要存三个数据,一个是自己本身,一个是它的前驱,一个是它的后继


构造方法


 LinkedList 有两个构造函数,第一个是默认的空的构造函数,第二个是将已有元素的集合Collection 的实例添加到 LinkedList 中,调用的是 addAll() 方法,这个方法下面我们会介绍。

  注意:LinkedList 是没有初始化链表大小的构造函数,因为链表不像数组,一个定义好的数组是必须要有确定的大小,然后去分配内存空间,而链表不一样,它没有确定的大小,通过指针的移动来指向下一个内存地址的分配。


添加元素

  • addFirst(E e)
  • 添加元素到链表的头部 只需要替换链表头部的后继指针就好了
  • addLast(E e)和add(E e)
  •  将指定元素添加到链表尾
  • add(int index, E element)
  • 讲元素拆入到指定的位置,这个要先找到这个元素的前后的元素,然后再修改。
  • addAll(Collection<? extends E> c)
  • 按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此列表的末尾


删除元素


删除元素和添加元素一样,也是通过更改指向上一个节点和指向下一个节点的引用即可。

  • remove()和removeFirst()
  • 从此列表中移除并返回第一个元素
  • removeLast()
  • 从该列表中删除并返回最后一个元素
  • remove(int index)
  • 删除此列表中指定位置的元素
  • remove(Object o)
  • 如果存在,则从该列表中删除指定元素的第一次出现,需要注意的是,这个是删除第一个出现的,并不是删除所有的这个元素


修改元素

通过调用 set(int index, E element) 方法,用指定的元素替换此列表中指定位置的元素。


  这里主要是通过 node(index) 方法获取指定索引位置的节点,然后修改此节点位置的元素即可。


查找元素

因为截图截不全我就没截图了,大家可以对着源码看,具体的实现确实也不难,前面我们手撕链表大部分也实现了

  • getFirst()
  • 返回此列表中的最后一个元素
  • getLast()
  • 返回此列表中的最后一个元素
  • get(int index)
  •  返回指定索引处的元素
  • indexOf(Object o)
  •  返回此列表中指定元素第一次出现的索引,如果此列表不包含元素,则返回-1。


遍历集合

普通 for 循环

代码很简单,我们就利用 LinkedList 的 get(int index) 方法,遍历出所有的元素。

 但是需要注意的是, get(int index) 方法每次都要遍历该索引之前的所有元素,这句话这么理解:比如上面的一个 LinkedList 集合,我放入了 A,B,C,D是个元素。

  • 总共需要四次遍历:
  • 第一次遍历打印 A:只需遍历一次。
  • 第二次遍历打印 B:需要先找到 A,然后再找到 B 打印。
  • 第三次遍历打印 C:需要先找到 A,然后找到 B,最后找到 C 打印。
  • 第四次遍历打印 D:需要先找到 A,然后找到 B,然后找到 C,最后找到 D。  
  • 这样如果集合元素很多,越查找到后面(当然此处的get方法进行了优化,查找前半部分从前面开始遍历,查找后半部分从后面开始遍历,但是需要的时间还是很多)花费的时间越多。那么如何改进呢?

迭代器 这个比较适合 迭代器的另一种形式就是使用 foreach 循环,底层实现也是使用的迭代器,这里我们就不做介绍了


总结


  • List继承了Collection,是有序的列表,可重复。
  • 实现类有ArrayList、LinkedList、Vector、Stack等
  • ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!,线程不安全。基于数组所以查快,增删慢,因为如果要删除的话,它后面的元素就要重新改版索引。
  • LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!,它的查慢,每次查都要遍历整个集合,但是它的增删快,特别是再头尾添加,特别的快。
  • Vector是基于数组实现的,是一个矢量队列,是线程安全的!基本差不多和ArrayList差不多,但是它是线程安全的,意味着性能没有那么好。

版本说明

  • 这里的源码是JDK8版本,不同版本可能会有所差异,但是基本原理都是一样的。

结尾


List的三个实现,讲完了,是不是感觉也不是很难呢?博主跟着学,发现以前只是用,但是现在确实熟悉很多了。下节开始讲Map,因为Set的底层是基于Map,它放最后

因为博主也是一个开发萌新 我也是一边学一边写 我有个目标就是一周 二到三篇 希望能坚持个一年吧 希望各位大佬多提意见,让我多学习,一起进步。

相关文章
|
3月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
3月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
17天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
27天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
53 3
|
1月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
39 4
|
1月前
|
存储 Java 索引
Java LinkedList详解
`LinkedList`是Java集合框架中的一个重要类,实现了`List`、`Deque`和`Cloneable`接口。它基于双向链表,支持动态扩展,允许重复元素。虽然通过索引访问元素的时间复杂度为O(n),但在插入和删除操作上表现优异,时间复杂度为O(1)。常用操作包括创建、添加、获取、删除和查找元素,以及使用迭代器遍历。适用于频繁插入和删除的场景,如队列和栈的实现。
|
1月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
74 0
|
2月前
|
Java API 索引
LinkedList的基本操作【集合容器知识回顾 ③】
本文详细介绍了LinkedList的基本操作,包括初始化、添加、获取、删除、替换元素、遍历,以及LinkedList独有的队列和栈相关操作,同时指出了LinkedList在插入和删除操作方面的优势以及在随机访问元素时的性能劣势。
|
3月前
|
存储 消息中间件 Java
何时在 Java 中使用 ArrayList 和 LinkedList
【8月更文挑战第23天】
32 2
|
3月前
|
存储 Java