add

 public boolean add(E e) {
//先确保数组容量
ensureCapacityInternal(size + 1);
//直接将值放在size位置
elementData[size++] = e;
return true;
} private void ensureCapacityInternal(int minCapacity) {
//如果刚开始为空,并且 容量小于默认容量,则初始化 默认容量 (10)
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//校验是否需要扩容
ensureExplicitCapacity(minCapacity);
} private void ensureExplicitCapacity(int minCapacity) {
//一定要修改modCount
modCount++; // 当容量大于当前元素条数,需要扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
} private void grow(int minCapacity) {
// 旧容量
int oldCapacity = elementData.length;
//新容量 = 旧容量 + 旧容量 * 2;
int newCapacity = oldCapacity + (oldCapacity >> 1);
//如果新容量还是小于需要的容量大小,则采用传入的minCapacity
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果minCapacity太大,还需要修正
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//最后使用Arrays.copyOf 方法扩容
elementData = Arrays.copyOf(elementData, newCapacity);
} private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//使用 Integer.MAX_VALUE
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

remove

 public E remove(int index) {
rangeCheck(index); modCount++;
//先获取该索引位置的值
E oldValue = elementData(index);
//找到需要复制的元素个数 a b c d e f (如果要删除 d,索引是3 6 - 3 -1 = 2)
int numMoved = size - index - 1;
//将后边的元素拷贝到被删除的索引的位置
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//最后一位置为 null
elementData[--size] = null; // clear to let GC do its work return oldValue;
}

get

 E elementData(int index) {
return (E) elementData[index];
}

最新文章

  1. android自定义控件一站式入门
  2. MongoDB学习笔记五—查询上
  3. Asp.net Core 1.0.1升级到Asp.net Core 1.1.0 Preview版本发布到Windows Server2008 R2 IIS中的各种坑
  4. 【转】apache kafka技术分享系列(目录索引)
  5. 关于ecshop中jquery与js冲突解决的方案
  6. CodeForces 18C
  7. Nodejs爬虫进阶教程之异步并发控制
  8. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
  9. 自动生成并导出word文档
  10. hdu1671字典树
  11. 带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
  12. ROS_Kinetic_25 在ubuntu16.04使用Leap_motion并作为手势输入控制Gazebo中的机器人
  13. Python之路【第七篇】:Python装饰器
  14. 使用POST请求实现页面的跳转
  15. 2018-2019-2 网络对抗技术 20165227 Exp2 后门原理与实践
  16. JSP中文乱码问题终极解决方案
  17. 对NP问题的一点感想
  18. webApi2 结合uploadify 上传报错解决办法
  19. python---RabbitMQ(5)消息RPC(远程过程调用)
  20. 初涉sqlmap

热门文章

  1. java基础之运算符与语句
  2. 使用postman测试接口时需要先登录怎么办
  3. SVN提交小结
  4. C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)
  5. [翻译]Review——24 tips for React Native you probably want to know
  6. mootools vs jquery
  7. html基础-标题标签-文字标签(2)
  8. Windows7设置锁屏密码
  9. Oracle数据库日期格式转换操作
  10. numpy meshgrid 和 mgrid 的两个简单实例和解析