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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 前言文本已收录至我的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,它放最后

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

相关文章
|
28天前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
56 0
|
14天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
160 37
|
14天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1天前
|
数据采集 运维 前端开发
【Java】全套云HIS源码包含EMR、LIS (医院信息化建设)
系统技术特点:采用前后端分离架构,前端由Angular、JavaScript开发;后端使用Java语言开发。
12 5
|
3天前
|
存储 安全 Java
Java 常用集合分类
Java 常用集合分类
13 2
|
9天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
28天前
|
存储 算法 Java
Java中的集合框架深度解析与实践
【8月更文挑战第31天】在Java编程的海洋中,集合框架扮演着不可或缺的角色。本文将带你领略Java集合框架的魅力,从理论到实践,深入浅出地探索List、Set和Map等核心接口的使用技巧。我们将通过具体代码示例,展示如何在日常开发中高效运用这些工具,让你的代码更加优雅和高效。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往Java集合世界的大门。
|
28天前
|
存储 人工智能 Java
JAVA集合
【8月更文挑战第31天】
|
4月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
412 1
|
4月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
139 0