List接口(源码阅读)

news2025/1/5 4:35:15

文章目录

    • 1.List接口常用方法
        • 1.代码
        • 2.结果
    • 2.ArrayList底层机制
        • 1.结论
        • 2.ArrayList底层源码
          • 1.代码
          • 2.debug添加第一个元素
            • 1.进入
            • 2.elementData数组存储ArrayList的数据
            • 3.初始化为空数组
            • 4.首先确保使用size+1来计算最小容量
            • 5.如果elementData为空,最小容量就是10
            • 6.modCount记录当前集合被修改的次数
            • 7.此时最小容量为10,大于数组的长度0,所以扩容
            • 8.扩容-计算旧容量为0
            • 9.扩容-新容量等于旧容量的1.5倍也就是0
            • 10.扩容-如果说新容量小于最小容量,那么就让最小容量为新容量也就是10
            • 11.扩容-将原数组的数据浅拷贝10个到新数组,如果没有元素就使用null填充
            • 12.新元素添加到size的位置上,然后size++
          • 3.debug添加第二个元素
            • 1.首先还是使用size+1来计算最小容量
            • 2.此时由于不是第一次添加,所以最最小容量就是size+1也就是2
            • 3.发现最小容量是小于数组长度的,所以不需要扩容
            • 4.新元素添加到size的位置上,然后size++
          • 4.debug添加第11个元素
            • 1.首先还是根据size+1来计算最小容量
            • 2.返回最小容量为11
            • 3.发现数组长度10,小于最小容量11,所以需要扩容
            • 4.扩容-旧长度为10
            • 5.新长度为10的一点五倍也就是15
            • 6.将原数组调用copyOf方法,复制15个元素到新数组中,没有值的五个元素使用null填充
            • 7.在size+1的位置插入新元素
          • 6.debug添加第16个元素
            • 1.首先还是根据size+1来计算最小容量,返回16
            • 2.发现数组长度15小于最小容量16,则需要扩容
            • 3.旧容量为15
            • 4.新容量是15的一点五倍也就是22
            • 5.数组扩容后将新元素添加到size的位置上,然后size++
          • 7.debug构造器指定大小时的扩容机制
            • 1.代码
            • 2.首先根据size+1来计算最小容量为10
            • 3.然后发现数组长度9小于最小容量10,所以进行扩容
            • 4.还是新容量为旧容量的1.5倍也就是9 + 4 = 13
            • 5.数组扩容后将新元素添加到size的位置上,然后size++
    • 3.Vector底层机制
        • 1.结论
        • 2.Vector底层源码
          • 1.Vector和ArrayList比较
          • 2.代码
          • 3.debug第一次添加元素
            • 1.初始化容量为10
            • 2.根据elementCount+1也就是最小容量,来判断是否要扩容
            • 3.如果最小容量大于数组长度,则需要进行扩容,所以目前不需要扩容
            • 4.elementCount位置插入新增的元素,然后elementCount++
          • 4.debug第十一次添加元素
            • 1.计算最小容量为10 + 1 = 11
            • 2.最小容量大于数组长度,所以需要扩容
            • 3.旧容量为10
            • 4.新容量为20,相当于两倍扩容
            • 5.扩容为20个元素,后面的使用null补齐
            • 6.扩容完成后,elementCount位置插入新增的元素,然后elementCount++
    • 4.LinkedList底层机制
        • 1.新增第一个元素底层源码
          • 1.代码
          • 2.debug
            • 1.add方法调用linkLast
            • 2.添加第一个节点
        • 2.新增第二个元素底层源码
          • 1.代码
          • 2.debug
            • 1.添加第二个节点
        • 3.删除元素底层源码
          • 1.代码
          • 2.debug
            • 1.调用removeFirst方法
            • 2.首先让f指向第一个节点,f不为空,调用unlinkFirst
            • 3.element指向该元素的值
            • 4.next指向当前元素的下一个元素
            • 5.将当前节点的值置为null
            • 6.将当前元素的下一个next指针指向null
            • 7.让first指向下一个节点
            • 8.让下一个节点的prev指向null
            • 9.将链表的元素个数减一
            • 10.最后返回删除的元素的值
    • 5.List集合选择

1.List接口常用方法

1.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        // add方法:添加元素
        list.add(1);
        System.out.println(list);
        // addAll方法:添加集合
        list.addAll(Arrays.asList(2, 3, 4, 5));
        System.out.println(list);
        // get方法:获取元素
        System.out.println("list.get(0) = " + list.get(0));
        // indexOf方法:获取元素下标
        System.out.println("list.indexOf(1) = " + list.indexOf(1));
        // lastIndexOf方法:获取元素最后一次出现的下标
        list.add(1);
        System.out.println(list);
        System.out.println("list.lastIndexOf(1) = " + list.lastIndexOf(1));
        // remove方法:删除指定下标的元素,并返回删除的元素
        Integer remove = list.remove(0);
        System.out.println("remove = " + remove);
        // set方法:修改指定下标的元素,并返回修改前的元素
        System.out.println("修改前" +  list);
        Integer set = list.set(0, 0);
        System.out.println("set = " + set);
        System.out.println("修改后:" + list);
        // subList方法:截取集合,0到2,不包含2
        List<Integer> subList = list.subList(0, 2);
        System.out.println("subList = " + subList);
    }
}
2.结果

2.ArrayList底层机制

1.结论

CleanShot 2024-11-01 at 15.13.40@2x

2.ArrayList底层源码
1.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        // 添加1-10个元素
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }
        // 添加11-15个元素
        for (int i = 11; i <= 15; i++) {
            list.add(i);
        }
        list.add(100);
        list.add(200);
        list.add(null);
    }
}
2.debug添加第一个元素
1.进入

CleanShot 2024-11-01 at 15.18.08@2x

2.elementData数组存储ArrayList的数据

CleanShot 2024-11-01 at 15.19.01@2x

3.初始化为空数组

CleanShot 2024-11-01 at 15.19.40@2x

4.首先确保使用size+1来计算最小容量

CleanShot 2024-11-01 at 15.25.57@2x

CleanShot 2024-11-01 at 15.26.19@2x

5.如果elementData为空,最小容量就是10

CleanShot 2024-11-01 at 15.29.51@2x

6.modCount记录当前集合被修改的次数

CleanShot 2024-11-01 at 15.33.08@2x

7.此时最小容量为10,大于数组的长度0,所以扩容

CleanShot 2024-11-01 at 15.36.21@2x

8.扩容-计算旧容量为0

CleanShot 2024-11-01 at 15.37.35@2x

9.扩容-新容量等于旧容量的1.5倍也就是0

CleanShot 2024-11-01 at 15.39.38@2x

10.扩容-如果说新容量小于最小容量,那么就让最小容量为新容量也就是10

CleanShot 2024-11-01 at 15.42.46@2x

11.扩容-将原数组的数据浅拷贝10个到新数组,如果没有元素就使用null填充

CleanShot 2024-11-01 at 15.51.07@2x

12.新元素添加到size的位置上,然后size++

CleanShot 2024-11-01 at 15.54.41@2x

CleanShot 2024-11-01 at 15.54.55@2x

3.debug添加第二个元素
1.首先还是使用size+1来计算最小容量

CleanShot 2024-11-01 at 15.57.01@2x

2.此时由于不是第一次添加,所以最最小容量就是size+1也就是2

CleanShot 2024-11-01 at 15.57.25@2x

3.发现最小容量是小于数组长度的,所以不需要扩容

CleanShot 2024-11-01 at 15.58.58@2x

4.新元素添加到size的位置上,然后size++

CleanShot 2024-11-01 at 16.00.28@2x

CleanShot 2024-11-01 at 16.00.35@2x

4.debug添加第11个元素
1.首先还是根据size+1来计算最小容量

CleanShot 2024-11-01 at 16.01.57@2x

2.返回最小容量为11

CleanShot 2024-11-01 at 16.02.22@2x

3.发现数组长度10,小于最小容量11,所以需要扩容

CleanShot 2024-11-01 at 16.03.56@2x

4.扩容-旧长度为10

CleanShot 2024-11-01 at 16.04.36@2x

5.新长度为10的一点五倍也就是15

CleanShot 2024-11-01 at 16.05.09@2x

6.将原数组调用copyOf方法,复制15个元素到新数组中,没有值的五个元素使用null填充

CleanShot 2024-11-01 at 16.06.37@2x

7.在size+1的位置插入新元素

CleanShot 2024-11-01 at 16.07.17@2x

6.debug添加第16个元素
1.首先还是根据size+1来计算最小容量,返回16

CleanShot 2024-11-01 at 16.09.01@2x

2.发现数组长度15小于最小容量16,则需要扩容

CleanShot 2024-11-01 at 16.09.43@2x

3.旧容量为15

CleanShot 2024-11-01 at 16.10.21@2x

4.新容量是15的一点五倍也就是22

CleanShot 2024-11-01 at 16.11.07@2x

5.数组扩容后将新元素添加到size的位置上,然后size++

CleanShot 2024-11-01 at 16.12.45@2x

CleanShot 2024-11-01 at 16.12.55@2x

7.debug构造器指定大小时的扩容机制
1.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>(9);
        // 添加1-9个元素
        for (int i = 1; i <= 9; i++) {
            list.add(i);
        }
        // 添加第十个元素,需要扩容
        list.add(100);
    }
}
2.首先根据size+1来计算最小容量为10

CleanShot 2024-11-01 at 16.19.35@2x

3.然后发现数组长度9小于最小容量10,所以进行扩容

CleanShot 2024-11-01 at 16.20.21@2x

4.还是新容量为旧容量的1.5倍也就是9 + 4 = 13

CleanShot 2024-11-01 at 16.21.01@2x

5.数组扩容后将新元素添加到size的位置上,然后size++

CleanShot 2024-11-01 at 16.22.48@2x

3.Vector底层机制

1.结论

CleanShot 2024-11-01 at 16.33.08@2x

2.Vector底层源码
1.Vector和ArrayList比较

CleanShot 2024-11-01 at 16.35.46@2x

2.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        Vector<Integer> vector = new Vector<>();
        // 添加11个元素
        for (int i = 0; i < 11; i++) {
            vector.add(i);
        }
    }
}
3.debug第一次添加元素
1.初始化容量为10

CleanShot 2024-11-01 at 19.48.56@2x

2.根据elementCount+1也就是最小容量,来判断是否要扩容

CleanShot 2024-11-01 at 19.52.01@2x

3.如果最小容量大于数组长度,则需要进行扩容,所以目前不需要扩容

CleanShot 2024-11-01 at 19.54.34@2x

4.elementCount位置插入新增的元素,然后elementCount++

CleanShot 2024-11-01 at 19.55.02@2x

4.debug第十一次添加元素
1.计算最小容量为10 + 1 = 11

CleanShot 2024-11-01 at 19.58.14@2x

2.最小容量大于数组长度,所以需要扩容

CleanShot 2024-11-01 at 19.59.32@2x

3.旧容量为10

CleanShot 2024-11-01 at 20.00.01@2x

4.新容量为20,相当于两倍扩容

5.扩容为20个元素,后面的使用null补齐

CleanShot 2024-11-01 at 20.01.41@2x

6.扩容完成后,elementCount位置插入新增的元素,然后elementCount++

CleanShot 2024-11-01 at 20.02.37@2x

4.LinkedList底层机制

1.新增第一个元素底层源码
1.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>();
        list.add(1);
        System.out.println(list);
    }
}
2.debug
1.add方法调用linkLast

CleanShot 2024-11-01 at 20.10.03@2x

2.添加第一个节点

CleanShot 2024-11-01 at 20.20.22@2x

CleanShot 2024-11-01 at 20.20.14@2x

2.新增第二个元素底层源码
1.代码
2.debug
1.添加第二个节点

CleanShot 2024-11-01 at 20.28.56@2x

3.删除元素底层源码
1.代码
package com.sunxiansheng.collection;

import java.util.*;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/11/1 14:00
 * @Version 1.0
 */
public class demo {

    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        // 默认删除第一个
        list.remove();
        System.out.println(list);
    }
}
2.debug
1.调用removeFirst方法

CleanShot 2024-11-01 at 20.32.26@2x

2.首先让f指向第一个节点,f不为空,调用unlinkFirst

CleanShot 2024-11-01 at 20.33.58@2x

CleanShot 2024-11-01 at 20.34.02@2x

3.element指向该元素的值

CleanShot 2024-11-01 at 20.37.12@2x

CleanShot 2024-11-01 at 20.37.06@2x

4.next指向当前元素的下一个元素

CleanShot 2024-11-01 at 20.39.00@2x

CleanShot 2024-11-01 at 20.38.53@2x

5.将当前节点的值置为null

CleanShot 2024-11-01 at 20.39.39@2x

CleanShot 2024-11-01 at 20.39.49@2x

6.将当前元素的下一个next指针指向null

CleanShot 2024-11-01 at 20.40.52@2x

CleanShot 2024-11-01 at 20.41.01@2x

7.让first指向下一个节点

CleanShot 2024-11-01 at 20.41.29@2x

8.让下一个节点的prev指向null

CleanShot 2024-11-01 at 20.42.45@2x

CleanShot 2024-11-01 at 20.42.37@2x

9.将链表的元素个数减一

CleanShot 2024-11-01 at 20.43.26@2x

10.最后返回删除的元素的值

CleanShot 2024-11-01 at 20.44.07@2x

CleanShot 2024-11-01 at 20.44.22@2x

5.List集合选择

CleanShot 2024-11-01 at 20.46.24@2x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫(一)- Requests 安装与基本使用教程

文章目录 前言一、简介及安装1. 简介2. 安装 Requests2.1 安装2.2 检查安装是否成功 二、使用 Requests 发送 HTTP 请求1. 发送 GET 请求2. 发送 POST 请求3. 发送 PUT 请求4. 发送 DELETE 请求5. 发送 HEAD 请求6. 发送 OPTIONS 请求 三、传递参数1. GET 请求传递 URL 参数1.1…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…

python-leetcode-多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; class Solution:def majorityElement(self, nums: List[int]) -> int:candidate Nonecount 0for num in nums:if count 0: # 更新候选元素candidate numcount (1 if num candidate else -1)return candidate

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图&#xff1a; 实现思路&#xff1a; 汇总数据&#xff1a;使用 reduce 方法遍历原始数据数组&#xff0c;将相同日期的数据进行合并&#xff0c;并计算每个日期的总和。创建日期映射&#xff1a;创建一个映射 dateMap&#xff0c;存储每个日期的对象列表。排序并添加…

MM-2024 | 智能体遇山开路,遇水架桥! ObVLN:突破障碍,受阻环境中的视觉语言导航

作者&#xff1a;Haodong Hong, Sen Wang, Zi Huang 单位&#xff1a;昆士兰大学 论文链接&#xff1a;Navigating Beyond Instructions: Vision-and-Language Navigation in Obstructed Environments (https://dl.acm.org/doi/pdf/10.1145/3664647.3681640) 代码链接&#…

1Panel自建RustDesk服务器方案实现Windows远程macOS

文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…

Tube Qualify弯管测量系统在汽车管路三维检测中的应用

从使用量上来说&#xff0c;汽车行业是使用弯管零件数量最大的单一行业。在汽车的燃油&#xff0c;空调&#xff0c;排气&#xff0c;转向&#xff0c;制动等系统中都少不了管路。汽车管件形状复杂&#xff0c;且由于安装空间限制&#xff0c;汽车管件拥有不同弯曲半径&#xf…

Excel文件恢复教程:快速找回丢失数据!

Excel文件恢复位置在哪里&#xff1f; Excel是微软开发的电子表格软件&#xff0c;它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯&#xff0c;但对于某些用户来说&#xff0c;恢复未保存/删除/丢失的Excel文件可能会很困难&#xff0c;更不用说…

R语言入门笔记:第一节,快速了解R语言——文件与基础操作

关于 R 语言的简单介绍 上一期 R 语言入门笔记里面我简单介绍了 R 语言的安装和使用方法&#xff0c;以及各项避免踩坑的注意事项。我想把这个系列的笔记持续写下去。 这份笔记只是我的 R 语言入门学习笔记&#xff0c;而不是一套 R 语言教程。换句话说&#xff1a;这份笔记不…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpcad…

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型&#xff1a;名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码&#xff1f; 3.1 工作原理&#xff1a;独热编码背后的机制 3.2 应用&#xff1a;独热编码的优势 四、什么是标签编码&#xff1f; 4.1 工作原理&…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

异常与中断(下)

文章目录 一、中断的硬件框架1.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.2.1 GPIO控制器1.2.2 EXTI1.2.3 NVIC1.2.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 STM32MP157的GPIO中断1.3.1 GPIO控制器1.3.2 EXTI1. 设置EXTImux2. 设置Event Trigger3. 设置Masking4. 查看…

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构&#xff0c;我们将创建一个动态购物车&#xff0c;支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…

STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)

中断:在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时&#xff0c;CPU会根据中断源的轻重缓急…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1&#xff1a;基于40K可验证医学问题的两阶段复杂推理增强框架&#xff0c;通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文&#xff1a;HuatuoGPT-o1, Towards …

07-计算机网络面试实战

07-计算机网络面试实战 计算机网络面试实战 为什么要学习网络相关知识&#xff1f; 对于好一些的公司&#xff0c;计算机基础的内容是肯定要面的&#xff0c;尤其是 30k 以内的工程师&#xff0c;因为目前处于的这个级别肯定是要去写项目的&#xff0c;还没上升到去设计架构的高…