ArrayList实现
数组实现父类:AbstractList接口:List,RandomAccess,Cloneable,Serializable字段://默认容量private static final int DEFAULT_CAPACITY = 10;//空的数组,构造函数参数为0和trim中使用,构造参数给0的人绝对会被打死,每放一个元素,就要重新copy一次private static final Object[] EMPTY_ELEMENTDATA = {};

//实际保存数组,transient,这个字段不用写入流transient Object[] elementData//实际元素数目private int size;

 public ArrayList(int initialCapacity)
{if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//注意初始容量为0时给的对象,EMPTY_ELEMENTDATAthis.elementData = EMPTY_ELEMENTDATA;}else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}public ArrayList(){//默认构造函数this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}public ArrayList(Collection<? extends E> c)
{//转入的集合转换为数组elementData = c.toArray();//改变自己的sizeif ((size = elementData.length) != 0) {//这里有个坑,可能不能正确的返回Object[] Class对象,不能的话复制// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else {// replace with empty array.this.elementData = EMPTY_ELEMENTDATA;}}//截断,在原数组上移动
public void trimToSize()
{modCount++;if (size < elementData.length) {elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);}}//比较关心的几个方法,存放,取出,查找
//查找,运行时间上界O(n),从这里也可用看出是允许放null
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;}//反向查找public int lastIndexOf(Object o)
{if (o == null) {for (int i = size-1; i >= 0; i--)if (elementData[i]==null)return i;} else {for (int i = size-1; i >= 0; i--)if (o.equals(elementData[i]))return i;}return -1;}
//返回index位置的元素
E elementData(int index)
{return (E) elementData[index];}//获取对应位置元素,O(1)public E get(int index)
{//检查size,并没有判断小于0rangeCheck(index);return elementData(index);
}//将元素放在对应位置,index<size,list当成数组使用,注意,这样的代码会报错
//List<String> list = new ArrayList<>(100);
//      list.set(10, "123");
//根据构造函数可以知道,已经开辟了100长度的数组,但是就是不让你用public E set(int index, E element)
{rangeCheck(index);E oldValue = elementData(index);elementData[index] = element;return oldValue;
}private void grow(int minCapacity)
{// overflow-conscious codeint 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://注意是新开辟一个数组给elementDataelementData = Arrays.copyOf(elementData, newCapacity);}private void ensureExplicitCapacity(int minCapacity)
{modCount++;// overflow-conscious code//1-0,进入if,进行内存复制,开辟新的数组if (minCapacity - elementData.length > 0)grow(minCapacity);
}private void ensureCapacityInternal(int minCapacity)
{//构造函数给0,这里是falseif (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}//ensureExplicitCapacity(1);ensureExplicitCapacity(minCapacity);}//增加一个元素public boolean add(E e) {//为什么构造函数给0会被打死,看下面这个函数,一来就要新数组,新的数组长度也只有1ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;}//元素放到index位置,0<=index<size
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++;
}
//移除public E remove(int index)
{rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;//内存复制if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;
}
//O(n)的移除,注意在fastRemove方法里面也会出现内存复制
public boolean remove(Object o)
{if (o == null) {for (int index = 0; index < size; index++)if (elementData[index] == null) {fastRemove(index);return true;}} else {for (int index = 0; index < size; index++)if (o.equals(elementData[index])) {fastRemove(index);return true;}}return false;}//为什么elementData不用置null,方便重用
public void clear()
{modCount++;// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;size = 0;}//浅克隆
public Object clone()
{try {ArrayList<?> v = (ArrayList<?>) super.clone();v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError(e);}}//返回副本public Object[] toArray()
{return Arrays.copyOf(elementData, size);
}结尾附上一个内存分布的代码,有指针真好
int main(int argc, char* argv[])
{//int ba[4];int a[] = { 1, 2, 3, 4 };int c = 5;int d = 6;int dd = 7;cout << a << endl;cout << a[-1] << endl;cout << a-1 << endl;cout<<&dd<<endl;cout << &d << endl;cout << &c << endl;//memcpy(ba, a, sizeof(int) * 4);//cout << ba[0] << endl;//cout << ba[1] << endl;return 0;
}

  

posted on 2017-09-10 23:27 好吧,就是菜菜 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/7502877.html

ArrayList实现相关推荐

  1. Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())

    一般想知道List 与ArrayList 的区别可能大部分都是看到了 List list = new ArrayList(); 和 ArrayList arrayList = new ArrayLis ...

  2. List 为什么可以实例化ArrayList

    昨天我带的一个同事问我List 为什么可以实例化ArrayList,刚开始一下萌了(带了快 2个月了) 比如List list = new ArrayList(); List 是一个接口, 接口使用的 ...

  3. ArrayList源码学习

    可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则是当前数组长度+当前数组长度的二分之一.容量上限是Integer.MAX_VALUE. copy ...

  4. 比较ArrayList、LinkedList、Vector

    翻译人员: 铁锚 翻译时间: 2013年12月2日 原文链接: ArrayList vs. LinkedList vs. Vector 1. List概述 List,就如图名字所示一样,是元素的有序列 ...

  5. 3月7日 ArrayList集合

    ArrayList与数组的区别: 数组是连续的.同一类型数据的一块区域,而集合可以是不连续的.多种数据类型的. 1.ArrayList ArrayList al = new ArrayList(); ...

  6. 转 java c++互传arraylist

    Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数) 2010-11-25 09:57 1694人阅读 评论(1) 收藏 举报 我们知道Java是一个运行在虚拟机里面的 ...

  7. List and ArrayList

    List<> and ArrayList Class Diagrams Using the Bit Complement of the BinarySearch() Result 代码   ...

  8. java arraylist和list_Java中ArrayList和LinkedList区别

    原文链接:http://pengcqu.iteye.com/blog/502676 一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据 ...

  9. Java 集合框架(二)—— ArrayList

    二.数组列表 -- ArrayList 1.构造方法 ArrayList 是 Java 中的动态数组,底层实现就是对象数组,只不过数组的容量会根据情况来改变. 它有个带 int 类型参数的构造方法,根 ...

  10. ArrayList Iterator remove java.lang.UnsupportedOperationException

    在使用Arrays.asList()后调用add,remove这些method时出现 java.lang.UnsupportedOperationException异常.这是由于Arrays.asLi ...

最新文章

  1. C++中string erase函数的使用
  2. Linux文件系统2---VFS的四个主要对象
  3. oracle 关闭如何启动,ORACLE启动和关闭实例
  4. java面试线程必备知识点,怼死面试官,从我做起
  5. oopc——3.封装
  6. Ubuntu14.04下安装Chrome出现“未安装软件包 libappindicator1”问题的解决办法
  7. JAVA虚拟机垃圾回收算法原理
  8. Codeforces Round #753 (Div. 3)E. Robot on the Board 1
  9. 矩阵多种乘法的辨析与python实现
  10. [转]22条经典的编程引言
  11. Your port 80 is actually used by : Server: Microsoft-IIS/10.0 Cannot install the Apache service, p
  12. xml与实体互相转换
  13. I2C(smbus、pmbus)和 SPI协议
  14. excel中怎样制作下拉菜单
  15. 如何用计算机算十进制,计算器怎么,计算机是怎么转换二进制为十进制的
  16. python 报错 TypeError: tuple indices must be integers or slices, not tuple
  17. apache-apr问题
  18. Java理论题(2)——简答题
  19. 虚拟机关机出现shutting down... running guests on default URT
  20. android dy 完结篇(0x3)

热门文章

  1. git pull 报错:Untracked Fles Preventing Merge
  2. 设计师更高效_如何丢掉我的工作使我成为一名更好的设计师
  3. 小程序卡片叠层切换卡片_现在,卡片和清单在哪里?
  4. css网格_一个CSS网格可以全部统治
  5. 【送书】2021年哪些好书值得读(小姐姐配音)
  6. MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync 1
  7. 你所不知道的setTimeout
  8. 关于是否在C#中加入不可空引用类型的争论
  9. adb logcat 查看日志
  10. UITableView定制accessoryView出现的连带问题