Java-----Collection 实现的ArrayList
来源:互联网 发布:冒险岛数据库中心 编辑:程序博客网 时间:2024/06/04 00:44
Java—–Collection 实现的ArrayList
1.ArrayList的内部其实就是创建的数组,在增删查改里面,对数组进行操作,所以,对于增加和删除来说,数组的操作是非常麻烦的,需要要变换数字后面的数据都要改变,而且还要考虑扩容的问题,数组的索引,对于查找来说,是很方便的 通过索引可以很快速的找到需要的数据。
2.ArrayList源代码,
在创建了一个实例 的时候,就会创建一个默认的存放数据的数组elementData,然后将一个默认的空数组赋值给了他,因为版本的差异,在JDK1.5之前,创建一个新的对象,系统会给这个对象一个长度为10的数组,而在JDK1.7之后,给这个对象赋值一个空的数组。
private transient Object[] elementData;private static final Object[] EMPTY_ELEMENTDATA = {}; public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; }
1.再进行添加操作的时候,会先判断,是不是新创建的对象,如果是新创建的一个数组,会给他一个默认的长度10,这时新的对象就创建了一个新的数组。如果不是第一次创建的对象,会先判断一下容量的大小,如果不满足条件,会进行扩容,每次扩容数组大小的1.5倍,然后在把数组copy到新的数组里面。
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }private void ensureCapacityInternal(int minCapacity) {//判断 是否是新创建的对象,并且赋值给她一个默认的长度 if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code //如果容量不够,将进行扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //每次都增加数组的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: //把值copy 到新创建的一个数组里面。 elementData = Arrays.copyOf(elementData, newCapacity); }
2.进行删除操作的时候,
public E remove(int index) {//先进行范围的一个判断 rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) //将要删除的值,直接覆盖,然后把最后一个数据置位null System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
3.getset操作
public E get(int index) {//对范围的一个判断。 rangeCheck(index);//通过索引直接找到数组里面的值,返回 return elementData(index); } public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); //通过索引,直接将该索引的值覆盖 elementData[index] = element; return oldValue; }
Arraylist 源代码,底部就是一个数组,操作的还是数组。所以,没什么难的,没事多看看源码,学学算法和数据结构。引用一句话:算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。
0 0
- Java-----Collection 实现的ArrayList
- 【java】【java collection】ArrayList
- Java Collection ArrayList
- Java-Collection-ArrayList
- java ArrayList 的实现
- Java.Collection.Set.List.Collection.ArrayList
- android_巧用SharedPrefrences储存ArrayList等Collection的实现类
- Java Collection笔记之ArrayList
- java集合Collection的List ArrayList LinkedList 区别
- 浅谈Java中Collection、Iterable、List、ArrayList间的关系
- java中ArrayList的实现
- Java ArrayList 的insert实现
- 数据结构--ArrayList的Java实现
- java ArrayList 的实现原理
- Java List的ArrayList实现
- Java ArrayList的底层实现
- 【JAVA】四 JAVA集合 Collection ArrayList LinkedList
- 关键字: java 集合框架 collection, arraylist, hashmap
- IplImage, CvMat, Mat 的关系
- 作用域注意事项
- 【项目】MFC下TCP/IP的套接字编程中CSocket,CSocketfile与CArchive类
- python 操作kafka
- leetcode-349. Intersection of Two Arrays
- Java-----Collection 实现的ArrayList
- Android系统相关组件解析(Android第一行代码学习笔记2)
- 数据结构实验之栈五:下一较大值(一)
- Xss学习(二)之 JavaScript
- python 第三天学习记录
- lua(4)-函数
- 【php插件】内容采集中实现再次post请求
- javaweb 杂项
- MYSQL常用函数总结