java源码-List源码解析
Java中的List是一个接口,它定义了一组操作列表的方法。List接口的常见子类包括ArrayList、LinkedList和Vector等。
以下是Java中List接口及其常见方法的源码解析:
1. List接口定义
```
public interface List<E> extends Collection<E> {
// 返回列表中元素的数量
int size();
// 返回列表是否为空
boolean isEmpty();
// 判断列表中是否包含指定元素
boolean contains(Object o);
// 返回列表中所有元素的迭代器
Iterator<E> iterator();
// 返回列表中所有元素的数组
Object[] toArray();
// 将列表中所有元素拷贝到指定数组中
<T> T[] toArray(T[] a);
// 添加指定元素到列表末尾
boolean add(E e);
// 删除列表中指定元素
boolean remove(Object o);
// 判断列表中是否包含指定集合中的所有元素
boolean containsAll(Collection<?> c);
// 向列表中添加指定集合中的所有元素
boolean addAll(Collection<? extends E> c);
// 删除列表中与指定集合中元素相同的元素
boolean removeAll(Collection<?> c);
// 仅保留列表中与指定集合中元素相同的元素
boolean retainAll(Collection<?> c);
// 清空列表中所有元素
void clear();
// 获取列表中指定位置的元素
E get(int index);
// 用指定元素替换列表中指定位置的元素
E set(int index, E element);
// 在列表中指定位置插入指定元素
void add(int index, E element);
// 删除列表中指定位置的元素
E remove(int index);
// 获取列表中指定元素第一次出现的位置
int indexOf(Object o);
// 获取列表中指定元素最后一次出现的位置
int lastIndexOf(Object o);
// 返回一个列表的子列表
List<E> subList(int fromIndex, int toIndex);
// 返回一个列表的并行流
Stream<E> parallelStream();
}
```
2. ArrayList类
ArrayList是一个基于数组实现的List类,它提供了调整大小、遍历和随机访问等常见操作。以下是ArrayList的常见方法:
```
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
// 构造函数
public ArrayList(int initialCapacity);
public ArrayList();
public ArrayList(Collection<? extends E> c);
// 返回列表中元素的数量
public int size();
// 判断列表是否为空
public boolean isEmpty();
// 判断列表中是否包含指定元素
public boolean contains(Object o);
// 返回列表中所有元素的迭代器
public Iterator<E> iterator();
// 返回列表中所有元素的数组
public Object[] toArray();
// 将列表中所有元素拷贝到指定数组中
public <T> T[] toArray(T[] a);
// 添加指定元素到列表末尾
public boolean add(E e);
// 删除列表中指定元素
public boolean remove(Object o);
// 判断列表中是否包含指定集合中的所有元素
public boolean containsAll(Collection<?> c);
// 向列表中添加指定集合中的所有元素
public boolean addAll(Collection<? extends E> c);
// 在列表末尾添加指定集合中的所有元素
public boolean addAll(int index, Collection<? extends E> c);
// 删除列表中指定集合中元素相同的元素
public boolean removeAll(Collection<?> c);
// 仅保留列表中与指定集合中元素相同的元素
public boolean retainAll(Collection<?> c);
// 清空列表中所有元素
public void clear();
// 获取列表中指定位置的元素
public E get(int index);
// 用指定元素替换列表中指定位置的元素
public E set(int index, E element);
// 在列表中指定位置插入指定元素
public void add(int index, E element);
// 删除列表中指定位置的元素
public E remove(int index);
// 获取列表中指定元素第一次出现的位置
public int indexOf(Object o);
// 获取列表中指定元素最后一次出现的位置
public int lastIndexOf(Object o);
// 返回一个列表的子列表
public List<E> subList(int fromIndex, int toIndex);
// 返回一个列表的并行流
public Stream<E> parallelStream();
// 对列表进行排序
public void sort(Comparator<? super E> c);
}
```
3. LinkedList类
LinkedList是一个基于双向链表实现的List类,它提供了添加、删除、检索以及与栈和队列相关的方法。以下是LinkedList的常见方法:
```
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
// 构造函数
public LinkedList();
public LinkedList(Collection<? extends E> c);
// 返回列表中元素的数量
public int size();
// 判断列表是否为空
public boolean isEmpty();
// 判断列表中是否包含指定元素
public boolean contains(Object o);
// 返回列表中所有元素的迭代器
public Iterator<E> iterator();
// 返回列表中所有元素的反向迭代器
public Iterator<E> descendingIterator();
// 在列表末尾添加指定元素
public boolean add(E e);
// 在列表头部添加指定元素
public void addFirst(E e);
// 在列表末尾添加指定元素
public void addLast(E e);
// 删除列表中指定元素
public boolean remove(Object o);
// 删除并返回列表头部的元素
public E remove();
// 删除并返回列表头部的元素
public E removeFirst();
// 删除并返回列表末尾的元素
public E removeLast();
// 获取列表头部元素
public E getFirst();
// 获取列表末尾元素
public E getLast();
// 替换列表中指定位置的元素
public E set(int index, E element);
// 在列表中指定位置插入指定元素
public void add(int index, E element);
// 获取列表中指定位置的元素
public E get(int index);
// 删除列表中指定位置的元素
public E remove(int index);
// 获取列表中指定元素第一次出现的位置
public int indexOf(Object o);
// 获取列表中指定元素最后一次出现的位置
public int lastIndexOf(Object o);
// 返回一个列表的子列表
public List<E> subList(int fromIndex, int toIndex);
}
```
4. Vector类
Vector是一个基于数组实现的List类,与ArrayList非常类似。不同之处在于Vector是线程安全的,支持同步操作。以下是Vector的常见方法:
```
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
// 构造函数
public Vector(int initialCapacity, int capacityIncrement);
public Vector(int initialCapacity);
public Vector();
public Vector(Collection<? extends E> c);
// 返回列表中元素的数量
public int size();
// 判断列表是否为空
public boolean isEmpty();
// 判断列表中是否包含指定元素
public boolean contains(Object o);
// 返回列表中所有元素的迭代器
public Iterator<E> iterator();
// 返回列表中所有元素的数组
public Object[] toArray();
// 将列表中所有元素拷贝到指定数组中
public <T> T[] toArray(T[] a);
// 添加指定元素到列表末尾
public synchronized boolean add(E e);
// 删除列表中指定元素
public synchronized boolean remove(Object o);
// 判断列表中是否包含指定集合中的所有元素
public synchronized boolean containsAll(Collection<?> c);
// 向列表中添加指定集合中的所有元素
public synchronized boolean addAll(Collection<? extends E> c);
// 在列表末尾添加指定集合中的所有元素
public boolean
上面的代码中,我们可以看到ArrayList类继承了AbstractList类,并实现了List、RandomAccess、Cloneable、Serializable接口。ArrayList内部使用一个Object数组elementData来存储元素,同时使用一个int类型的变量size来记录ArrayList的大小。
在ArrayList的构造函数中,我们可以看到有两种不同的构造方法。第一种是无参构造方法,它将elementData初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。第二种是有参构造方法,可以传入一个整型参数来指定ArrayList的容量,如果该参数小于等于0,则将elementData初始化为EMPTY_ELEMENTDATA;如果该参数大于0,则会初始化一个大小为initialCapacity的Object数组。
在ArrayList中添加元素的方法有两种:add和add(int index, E element)。add(E e)方法是最常用的添加元素的方法,它将元素添加到ArrayList的末尾。而add(int index, E element)方法则可以将元素添加到ArrayList的特定位置。
在ArrayList中获取元素的方法是get(int index)。在ArrayList中删除元素的方法是remove(int index)。而在ArrayList中修改元素的方法是set(int index, E element)。
在ArrayList中自动扩容的方法是ensureCapacityInternal(int minCapacity)和grow(int minCapacity)。其中,ensureCapacityInternal(int minCapacity)方法是一个私有方法,它用来判断是否需要扩容,如果需要则调用grow(int minCapacity)方法进行扩容。grow(int minCapacity)方法会创建一个新的Object数组,并将原来的Object数组中的元素复制到新数组中,然后将新数组赋值给elementData变量。
以上是一个简单的ArrayList类的源码解析,可以帮助我们更好地理解List接口的实现和内部实现原理。
相关文章:
java源码-List源码解析
Java中的List是一个接口,它定义了一组操作列表的方法。List接口的常见子类包括ArrayList、LinkedList和Vector等。 以下是Java中List接口及其常见方法的源码解析: 1. List接口定义 public interface List<E> extends Collection<E> { …...
Mybatis的动态SQL
动态 sql 是Mybatis的强⼤特性之⼀,能够完成动态的 sql 语句拼接。 动态 SQL 大大减少了编写代码的工作量,更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 Mybatis里的动态标签主要有: <if><trim><where><set><forea…...
嵌入式系统中的GPIO控制:从理论到实践与高级应用
本文将探讨嵌入式系统中的GPIO(通用输入输出)控制,着重介绍GPIO的原理和基本用法。我们将使用一个实际的示例项目来演示如何通过编程配置和控制GPIO引脚。将基于ARM Cortex-M微控制器,并使用C语言进行编写。 GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工…...
7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?
7D透明屏是一种新型的显示技术,它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域,如商业广告、展览展示、智能家居等,具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术,将图像通过透明屏幕投射出来…...
[游戏开发][Unity] 打包Xcode工程模拟器+真机调试
苹果开发者账号 账号分三类,个人,公司,企业,价格99/99/299美金 新注册账号的基本设置按网上的教程来就行 我们公司是企业账号,我的苹果开发者账号是公司一个User 下面讲述一下一个全新的打包机处理流程 首先是要把…...
python 添加环境变量
1 查看是否设置环境变量 和 使用的python在哪里安装 import sys import os# 获取Python的安装目录 import os import syspython_path sys.executable # 这个是python.exe的路径python_path os.path.dirname(python_path) print("Python安装路径:", python_path)# …...
如何用DHTMLX组件为Web应用创建甘特图?(一)
dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求,是最完善的甘特图图表库。甘特图仍然是项目管理应用程序中最需要的工具之一,DHTMLX Gantt组件提供了能提升研发甘特图功能所需的重要工具。 在这篇…...
网站SEO优化:提升搜索排名与流量引爆
导言: 在互联网时代,网站SEO(搜索引擎优化)是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面,让搜索引擎更好地理解和收录网站内容,从而为网站带来更多有价值的有机…...
Java lamda对List<JSONObject>里多个动态属性字段进行动态的降序或者升序
最近做到一个需求,需要把业务侧返回的数据(格式为List<JSONObject>),然后根据前端传来的排序字段、以及升降序属性来排序并返回给前端。要对List<JSONObject>中的多个属性字段进行动态的升序或降序排序,我们可以根据需…...
Lua脚本解决多条命令原子性问题
Redis是一个流行的键值存储数据库,它提供了丰富的功能和命令。在Redis中,我们可以使用Lua脚本来编写多条命令,以确保这些命令的原子性执行。Lua是一种简单易学的编程语言,下面将介绍如何使用Redis提供的调用函数来操作Redis并保证…...
NAT详解(网络地址转换)
一句话说清楚它是干什么的: 网络地址转换:是指通过专用网络地址转换为公用地址,从而对外隐藏内部管理的IP地址,它使得整个专用网只需要一个全球IP就可以访问互联网,由于专用网IP地址是可以重用的,所以NAT大…...
【第一阶段】ktolin的函数
在Java中我们称之为方法,方法必须写在类里面,依赖于类。 在kotlin中函数写在类里面和外面都是可以的。称之为函数 class test{fun view(){} }fun main() {println("Hello, world!!!") }执行结果 Hello, world!!!main函数的返回值类型为Unit等…...
pytorch模型的保存与加载
1 pytorch保存和加载模型的三种方法 PyTorch提供了三种种方式来保存和加载模型,在这三种方式中,加载模型的代码和保存模型的代码必须相匹配,才能保证模型的加载成功。通常情况下,使用第一种方式(保存和加载模型状态字…...
IDE /完整分析C4819编译错误的本质原因
文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…...
前端学习路线(2023)
这个前端学习路线看起来很详细和全面,涵盖了从基础知识到高级框架,从单机开发到全栈项目,从混合应用到原生应用,从性能优化到架构设计的各个方面。如果你能够按照这个路线学习和实践,我相信你一定能够成为一名优秀的前…...
景区如何对旅行社进行分销管理?
旅行社的买票能力强,一般景区会跟多家旅行社合作门票分销。其中卖票下单、价格设定、财务对账结算都出现了很多问题,导致对账困难,查询困难,甚至可能有偷票漏票的情况出现,给景区收入造成损失。那要怎么处理呢…...
四步从菜鸟到高手,Python编程真的很简单(送书第一期:文末送书2本)
🍁博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支持,我…...
Thread类的常用结构(java))
1 构造器 public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :指定创建线程的目标对象,它实现了Runnable接口中的run方法public Thread(Runnable target,String name) :分配一…...
CSS :nth-child
CSS :nth-child :nth-child 伪类根据元素在同级元素中的位置来匹配元素. CSS :nth-child 语法 值是关键词 odd/evenAnB最新的 [of S] 语法权重 浏览器兼容性 很简单的例子, 来直觉上理解这个伪类的意思 <ul><li class"me">Apple</li><li>B…...
国内好用的企业级在线文档有哪些?
在当今数字化时代,企业级在线文档已经成为了现代办公环境中不可或缺的一部分。它不仅能够提高工作效率,还能够实现多人协同编辑,满足团队协作的需求。那么,在国内市场上,哪些企业级在线文档产品备受企业青睐呢…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
