摘要:返回删除元素的删除方法记录修改次数的变量根据数组下标拿到指定元素计算移动位数把中复制到,最后一个元素置为下标检查,如果大于数组的,抛出异常返回一个值的删除方法传进来,删除第一个值为的值注意此时加入了两个值此时执行了一句只删除了
1.返回删除元素的删除方法
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中(index+1,size-1)复制到(index,size-1) elementData[--size] = null; // size-1,最后一个元素置为null return oldValue; }
下标检查,如果大于数组的size,抛出异常
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }2.返回一个boolean值的删除方法
2.1传进来null,删除第一个值为null的值(注意此时加入了两个null值)
此时执行了一句list.remove(null);只删除了在物理位置上比较靠前的null,第二次删除才会删除第二个null
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; }
此方法执行的就是上面"返回删除元素"方法中的内容
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; }3.从这个列表中删除所有未包含在指定集合中的元素
public boolean retainAll(Collection> c) { Objects.requireNonNull(c); // 检查,如果此对象为空,抛出空指针异常 return batchRemove(c, true); }
private boolean batchRemove(Collection> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { for (; r < size; r++) //如果传入的集合c,包含当前所遍历的数组的元素,重新整理一下list中的元素 if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // 抛出异常后的处理(下面为JDK中的描述) // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) { System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67672.html
摘要:如果这个是刚刚初始化好的容量为,则为默认值若容量不固定,则比较与的大小,返回最大值。现在最小容量大小超过现在数组的长度,增长自增倍大于溢出三元表达式,大于取整形最大值用新的长度创建一个新数组把原数组的内容拷贝到新数组中,并返回新数组 一、构造方法 1.创建一个空ArrayList public ArrayList() { this.elementData = DEFAULTCA...
摘要:类库中提供了一套相当完整的容器类来解决这个问题,其中基本类型有,,,,这些对象类型被称为集合类。但是,类库中使用了来指代集合类中的子集,,,所以集合类也被称为容器。五类型是能够将对象映射到其他对象的一种容器,有区别于的方法。 引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》 了解容器前,先提出一个问题,ArrayL...
摘要:更加实际的定义应该是一个集合是一个容器,它其中所包含的元素的值是唯一的。对而言,键只是指存储在容器中的某一成员。成员函数构造函数中的元素都是模板类对象。元素按照成员变量从小到大排列,缺省情况下用定义关键字的小于关系。 分类:set, multiset, map, multimap 特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。 常用函数: find: 查找等于...
摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...
阅读 2148·2021-11-18 10:02
阅读 3249·2021-11-11 16:55
阅读 2665·2021-09-14 18:02
阅读 2398·2021-09-04 16:41
阅读 1999·2021-09-04 16:40
阅读 1068·2019-08-30 15:56
阅读 2182·2019-08-30 15:54
阅读 3129·2019-08-30 14:15