资讯专栏INFORMATION COLUMN

初探ArrayList之删除

wayneli / 1843人阅读

摘要:返回删除元素的删除方法记录修改次数的变量根据数组下标拿到指定元素计算移动位数把中复制到,最后一个元素置为下标检查,如果大于数组的,抛出异常返回一个值的删除方法传进来,删除第一个值为的值注意此时加入了两个值此时执行了一句只删除了

1.返回删除元素的删除方法

</>复制代码

  1. public E remove(int index) {
  2. rangeCheck(index);
  3. modCount++;//记录修改次数的变量
  4. E oldValue = elementData(index);//根据数组下标拿到指定元素
  5. int numMoved = size - index - 1;//计算移动位数
  6. if (numMoved > 0)
  7. System.arraycopy(elementData, index+1, elementData, index,
  8. numMoved);//把elementData中(index+1,size-1)复制到(index,size-1)
  9. elementData[--size] = null; // size-1,最后一个元素置为null
  10. return oldValue;
  11. }

下标检查,如果大于数组的size,抛出异常

</>复制代码

  1. private void rangeCheck(int index) {
  2. if (index >= size)
  3. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  4. }
2.返回一个boolean值的删除方法

2.1传进来null,删除第一个值为null的值(注意此时加入了两个null值)

此时执行了一句list.remove(null);只删除了在物理位置上比较靠前的null,第二次删除才会删除第二个null

</>复制代码

  1. public boolean remove(Object o) {
  2. if (o == null) {
  3. for (int index = 0; index < size; index++)
  4. if (elementData[index] == null) {
  5. fastRemove(index);
  6. return true;
  7. }
  8. } else {
  9. for (int index = 0; index < size; index++)
  10. if (o.equals(elementData[index])) {
  11. fastRemove(index);
  12. return true;
  13. }
  14. }
  15. return false;
  16. }

此方法执行的就是上面"返回删除元素"方法中的内容

</>复制代码

  1. private void fastRemove(int index) {
  2. modCount++;
  3. int numMoved = size - index - 1;
  4. if (numMoved > 0)
  5. System.arraycopy(elementData, index+1, elementData, index,
  6. numMoved);
  7. elementData[--size] = null;
  8. }
3.从这个列表中删除所有未包含在指定集合中的元素

</>复制代码

  1. public boolean retainAll(Collection c) {
  2. Objects.requireNonNull(c); // 检查,如果此对象为空,抛出空指针异常
  3. return batchRemove(c, true);
  4. }

</>复制代码

  1. private boolean batchRemove(Collection c, boolean complement) {
  2. final Object[] elementData = this.elementData;
  3. int r = 0, w = 0;
  4. boolean modified = false;
  5. try {
  6. for (; r < size; r++)
  7. //如果传入的集合c,包含当前所遍历的数组的元素,重新整理一下list中的元素
  8. if (c.contains(elementData[r]) == complement)
  9. elementData[w++] = elementData[r];
  10. } finally {
  11. // 抛出异常后的处理(下面为JDK中的描述)
  12. // Preserve behavioral compatibility with AbstractCollection,
  13. // even if c.contains() throws.
  14. if (r != size) {
  15. System.arraycopy(elementData, r,
  16. elementData, w,
  17. size - r);
  18. w += size - r;
  19. }
  20. if (w != size) {
  21. // clear to let GC do its work
  22. for (int i = w; i < size; i++)
  23. elementData[i] = null;
  24. modCount += size - w;
  25. size = w;
  26. modified = true;
  27. }
  28. }
  29. return modified;
  30. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67672.html

相关文章

  • 初探ArrayList添加

    摘要:如果这个是刚刚初始化好的容量为,则为默认值若容量不固定,则比较与的大小,返回最大值。现在最小容量大小超过现在数组的长度,增长自增倍大于溢出三元表达式,大于取整形最大值用新的长度创建一个新数组把原数组的内容拷贝到新数组中,并返回新数组 一、构造方法 1.创建一个空ArrayList public ArrayList() { this.elementData = DEFAULTCA...

    XiNGRZ 评论0 收藏0
  • JAVA 持有对象——容器初探(持续补充)

    摘要:类库中提供了一套相当完整的容器类来解决这个问题,其中基本类型有,,,,这些对象类型被称为集合类。但是,类库中使用了来指代集合类中的子集,,,所以集合类也被称为容器。五类型是能够将对象映射到其他对象的一种容器,有区别于的方法。 引言 如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》 了解容器前,先提出一个问题,ArrayL...

    aikin 评论0 收藏0
  • 初探STL关联容器

    摘要:更加实际的定义应该是一个集合是一个容器,它其中所包含的元素的值是唯一的。对而言,键只是指存储在容器中的某一成员。成员函数构造函数中的元素都是模板类对象。元素按照成员变量从小到大排列,缺省情况下用定义关键字的小于关系。 分类:set, multiset, map, multimap 特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快。 常用函数: find: 查找等于...

    objc94 评论0 收藏0
  • 初探Java类型擦除

    摘要:可以看到,如果我们给泛型类制定了上限,泛型擦除之后就会被替换成类型的上限。相应的,泛型类中定义的方法的类型也是如此。参考语言类型擦除下界通配符和的区别 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为了让你们快速的对类型擦除有一个印象,首先举一个很简单也很经典的例子。 // 指定泛型为String List list1 ...

    DevTalking 评论0 收藏0
  • 初探STL算法

    摘要:算法部分主要由头文件组成。数值算法对容器内容进行数值计算。在指定范围内查找由输入的另外一对标志的第二个序列的最后一次出现。重载函数使用自定义比较操作。删除指定范围内所有等于指定元素的元素。返回,指出序列中最小的元素。 STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。 分类 STL中算法大致分为...

    nanfeiyan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<