目录
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));
}
}