当前位置:网站首页>【ArrayList、LinkedList使用get()方法获取元素时的效率对比,以及源码分析】
【ArrayList、LinkedList使用get()方法获取元素时的效率对比,以及源码分析】
2022-08-07 05:15:00 【ContinueWW】
目录
1.ArrayList使用get()方法的底层源码
1.1ArrayList查找快的源码分析
注意:ArrayList底层使用的是数组
public class ArrayList<E> {
//集合的长度
private int size;
//ArrayList集合存储元素的那个数组
private Object[] elementData;
//ArrayList根据索引获取元素的方法
//参数index:每次调用get方法传递的 索引
public E get(int index) {
rangeCheck(index);
//取出元素的方法
return elementData(index);
}
//取出数据的方法
Object elementData(int index) {
//没有循环遍历,直接使用数组名+索引的方式 快速取出元素
return elementData[index];
}
//校验索引是否越界
private void rangeCheck(int index) {
//如果索引大于等于集合的长度,那么就制造一个索引越界的异常
if (index >= size)
throw new IndexOutOfBoundsException(index);
}
}
2. LinkedList使用get()方法的底层源码
2.1LinkedList底层使用的是链表
注意:LinkedList底层使用的是链表
链表结构的演示:
public class Test01 {
public static void main(String[] args) {
/**
* 需求:简单的演示一下链表结构
* 由一个个节点【对象,Node】组成
*/
//创建一个节点对象,代表最后一个节点
Node lastNode = new Node("平平无奇古天乐",null);
//创建一个节点对象,代表第一个节点
Node firstNode = new Node("悔创阿里杰克马",lastNode);
}
}

2.2LinkedList查找慢的源码分析
public class LinkedList<E> {
//LinkedList获取元素的方法
public E get(int index) {
//校验索引是否越界
checkElementIndex(index);
//node(index):获取链表上节点的方法
//node.item: 获取的就是节点的内容
return node(index).item;
}
//链表获取元素的方法
Node<E> node(int index) {
//判断get方法的参数【索引】 是否小于 集合长度的 一半
if (index < (size / 2)) {
//如果小于一半,就从 第一个节点开始一个个的向后找
Node<E> x = first;
for (int i = 0; i < index; i++)
//循环一次,就将下一个节点的地址赋值给X
x = x.next;
return x;
} else {
//将最后一个节点赋值给X
Node<E> x = last;
//从集合的最后一个节点向前找
for (int i = size - 1; i > index; i--)
//每次循环,将上一个节点赋值给x
x = x.prev;
return x;
}
}
//判断索引是否越界
private void checkElementIndex(int index) {
if (! index >= 0 && index < size )
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
3.ArrayList、LinkedList使用get()方法获取元素时的效率对比
package day06;
import java.util.ArrayList;
import java.util.LinkedList;
public class Test02 {
public static void main(String[] args) {
//创建一个ArrayList,添加10W个元素
ArrayList<String> arrayList = new ArrayList<>();
//循环10W次
for (int i = 0; i < 100000; i++) {
//添加元素
arrayList.add(i+"");
}
//创建一个LinkedList,添加10W个元素
LinkedList<String> linkedList = new LinkedList<>();
//循环10W次
for (int i = 0; i < 100000; i++) {
//添加元素
linkedList.add(i+"");
}
System.out.println("arrayList 和 linkedList 都存储了10W个元素");
//对比一下,取出元素的速度
//遍历arrayList,记录取出10W个元素用时多少
//在循环之前先获取系统的毫秒值
long startTime = System.currentTimeMillis();
for (int i = 0; i < arrayList.size(); i++) {
//调用get方法获取元素
arrayList.get(i); //在此处打一个断点,看源码
}
long endTime = System.currentTimeMillis();
System.out.println("arrayList取出10W个元素用时:"+(endTime - startTime));
System.out.println("---------------");
//再次获取时间,且重新给 startTime 和 endTime赋值
startTime = System.currentTimeMillis();
for (int i = 0; i < linkedList.size(); i++) {
//调用get方法获取元素
linkedList.get(i);//在此处打一个断点,看源码
}
endTime = System.currentTimeMillis();
System.out.println("linkedList取出10W个元素用时:"+(endTime - startTime));
}
}
边栏推荐
猜你喜欢

云服务器配置jupyter

对联邦学习的威胁、攻击和防御:问题、分类和观点

基于STC8G2K64S4单片机控制步进电机

基于STC8G2K64S4单片机控制直流电机

2022/6/27 Quartz (timed task) explanation + introductory case

基于STC8G2K64S4单片机控制舵机

四路DI四路继电器输出,RS-485/232数据采集远程I/O模块

【DGIOT】支持远程打印条码/二维码和一码设备全生命周期管理

SPI协议

dgiot-dtu realizes PLC data acquisition and real-time viewing on the cloud
随机推荐
网络安全:系统目录介绍
Cracking web timer
DGIOT物联网开源平台——腾讯云轻量应用服务器部署
2022/5/8 SSM framework integrates CRUD (fuzzy query + paging) (detailed case)
DGIOT产品管理
1.SDRAM简介
深入了解神经网络
序列数据和文本的深度学习
DG-IoT日志系统
acwing 905 区间选点
DIN11 IPO 压力应变桥信号处理系列隔离放大器 配电 10V 2mV/V转4-20mA 一入一出
DOS常用命令
thymeleaf 学习笔记
2022/4/21 盘点Thymeleaf遇到的坑
I2C协议
【计网基础】OSI七层模型及各层相关协议
【计网基础】TCP相关笔记
DC升压直流高压电源模块12V24v转100V150V200V250V300V350v1000伏线性变化电压控制输出
2022/6/27 Quartz(定时任务)讲解+入门案例
acwing 907 区间覆盖