java ArrayList中的remove方法介绍

 更新时间:2022年01月10日 10:38:49   作者:小羊子说  
大家好,本篇文章主要讲的是java ArrayList中的remove方法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

先看一段代码,看看自定义的ArrayList中的remove设计是否有问题。

public class MyArrayList {
    private Object[] mData = new Object[0];
    private int mSize = 0;
    // 删除第i个元素
    public void remove(int i) {
        if (i < 0 || i >= mSize) return;
        for (int index = i; index < mSize - 1; index++) {
            mData[index] = mData[index + 1];
        }
        --mSize;
    }
    // ... 其他方法略
}

走进源码:

针对remove,有两种方式实现

(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[--size] = null; // clear to let GC do its work

        return oldValue;
    }

实现步骤:

检查所要移除的位置是否落在数组元素长度之内。

修改次数+1把需要删除的元素赋给oldValue,一遍方法返回旧元素numMoved计算出的是删除元素后需要移动的元素数。

当numMoved>0 说明删除元素后需要把后面的元素往前移动。

当numMoved<0 时,说明删除的元素为最后一个元素。

直接把最后一个位置置空。(分析重点:将最后的位置要设置为空,让垃圾回收器回收 ,防止对象游离)返回被删值

(2)根据内容删

参考资料:

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;
}

其中的fastRemove,代码如下:

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; // clear to let GC do its work
}

实现步骤:

因为对象是否相等需要使用equals方法,但是空对象不能使用equals方法比较。

因此需要先判断传入的对象是否为空。

为空时 使用==来寻找数组中空对象并删除。不为空时,便使用equals遍历寻找来删除相应对象。

OK,ArrayList的第一阶段的研究到此结束,针对开头的问题,已经找到了答案。

remove的设计有问题,–mSize;之后需要把mData[–mSize]=null;让垃圾回收器回收 ,防止对象游离。

未来有时间的研究方向大概如下,

​ArrayList​​ VS ​​LinkedList​

如何自定义一个​​ArrayList​

ArrayList的研究有时间可以再深入了解一下。网上的文章已经很多,在此不在赘述。旨在加深自我认知,上述大家如有疑问,欢迎PK。

到此这篇关于java ArrayList中的remove方法介绍的文章就介绍到这了,更多相关java ArrayList中的remove内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java毕业设计实战之健身器材商城系统的实现

    Java毕业设计实战之健身器材商城系统的实现

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Jdbc+Servlet+Ajax+Fileupload+mysql实现健身器材商城系统,大家可以在过程中查缺补漏,提升水平
    2022-03-03
  • java使用elasticsearch分组进行聚合查询过程解析

    java使用elasticsearch分组进行聚合查询过程解析

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java进阶之SPI机制详解

    Java进阶之SPI机制详解

    Java SPI机制在很多大型中间建码,例如Dubbo中均有采用,属于高级Java开发的进阶必备知识点,务必要求掌握.文中有非常详细的代码示例及解释,需要的朋友可以参考下
    2021-05-05
  • Java爬虫抓取视频网站下载链接

    Java爬虫抓取视频网站下载链接

    本文是通过JAVA获取优酷、土豆、酷6、6间房等视频,小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java中利用栈实现字符串回文算法

    java中利用栈实现字符串回文算法

    给定一个由多个a和b组成的字符串数组,字符串中有一个特殊的字符X,位于字符串的正中间,例如(aaaabbbbXabaabbbb),如何判定该字符串是否回文
    2020-12-12
  • 关于@ResponseBody 默认输出的误区的解答

    关于@ResponseBody 默认输出的误区的解答

    这篇文章主要介绍了关于@ResponseBody 默认输出的误区的解答,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】

    这篇文章主要介绍了Java设计模式之工厂模式,结合实例形式分析了简单工厂、工厂方法、抽象工厂等相关功能、实现与使用方法,需要的朋友可以参考下
    2018-04-04
  • Java代理模式的示例详解

    Java代理模式的示例详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-02-02
  • Java设计模式中的装饰者模式

    Java设计模式中的装饰者模式

    这篇文章主要介绍了Java设计模式中的装饰者模式,装饰者模式即Decorator Pattern,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
    2022-07-07
  • Struts2的输入校验实例代码

    Struts2的输入校验实例代码

    这篇文章主要介绍了Struts2的输入校验实例代码,非常不错,具有参考借鉴价值, 需要的朋友可以参考下
    2017-03-03

最新评论