源码日记——ArrayList
来源:互联网 发布:淘宝机票平台出租 编辑:程序博客网 时间:2024/06/03 09:50
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
方法追踪:public boolean contains(Object o) { return indexOf(o) >= 0;}
——>>public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++)
if (o.equals(elementData[i])) return i; } return -1; }
分析:屏蔽参数为null,则核心o.equals(elementData[i])和i<size;从这两点可以猜测核心是素组组成elementData[i],并且素组大小为类变量size。
总结:contains方法根据参数,用参数跟数组中的内容进行对比,如果相同(意味数组中包含元素与参数相同)就返回true,否则返回false。
public Object[] toArray() { return Arrays.copyOf(elementData, size); }//将数组内容复制一份作为返回值返回。
======================================================
get方法对比step1:与LinkedList的get方法对比
ArrayList实现方法:
public E get(int index) {
rangeCheck(index);
return elementData(index);
}//这里忽略rangeCheck(index);——>>
E elementData(int index) {
return (E) elementData[index];
}
LinkedList实现方法:
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}//这里忽略checkElementIndex(index);——>>
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
比较结果:ArrayList实现get方法是通过数组下标直接找到对应元素,而LinkedList则是从元素列表头部开始遍历寻找,结果不言而喻了。
set方法:public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; }
将元素element,放入到下标为index的数组位置上,替换掉原来的元素,并把原先的元素作为返回值返回。
与LinkedList实现不同之处与get方法大同小异。
add方法:①public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
比LinkedList麻烦多,LinkedList中只需要修改最后元素并把参数作为最后元素就OK,而ArrayList要复杂的多,主要体现在容量扩张上 ensureCapacityInternal(size + 1),顾名思义 确保 容量够用。效果明显不如Linkedlist。
②public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
目的是在数组的某位置上index插入一个元素element,与Linkedlist对比的话,分两部分,第一步先找到第index个元素,ArrayList要优于LinkedList,而将element插入内容中LinkedList就比较有优势。。如果元素个数多,查找过程LinkedList吃亏,但是在插入过程ArrayList就不如LinkedList了,对于这个方法应该不能从元素个数判别使用哪个更好。
LinkedList和ArrayList方法中都存在remove(int index);和remove(Object o);两种方法,都是移除元素,前者按照元素排序号删除,后者则是指定固定元素删除。
- 源码日记——ArrayList
- 源码分析—ArrayList
- ArrayList——ArrayList.add()源码分析
- 源码日记——LinkedList
- JDK源码阅读——ArrayList(1)
- JDK源码阅读——ArrayList\LinkedList
- Java源码解读——ArrayList
- JDK源码阅读——ArrayList(2)
- Java集合——ArrayList源码详解
- JDK源码阅读——ArrayList
- jdk源码阅读——ArrayList
- Java基础——ArrayList源码分析
- 集合框架源码学习——ArrayList
- JDK——ArrayList源码分析
- Java——读ArrayList源码
- ArrayList源码解析——JDK1.8
- 一行一行读Java源码——ArrayList
- Java集合—ArrayList的源码解读
- 一个java文件中可以有多个类
- redis支持的数据类型、操作指令及使用场景
- python入门系列20―——GUI Tkinter入门
- 【Centos7笔记七】用户及文件权限管理
- 尝试后可以成功在Ubuntu安装node.js的方法
- 源码日记——ArrayList
- JS中的prototype
- 用GDB调试程序
- 区块链技术运用在票据领域-票据链
- 分针网——每日分享:Vue计算属性
- 初见Java多线程(一、线程的概念)
- thinkphp的无刷新分页
- 【ubuntu】各个版本镜像下载地址
- 智慧交通大数据可视化