`
bmqnc
  • 浏览: 127625 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中的ArrayList的remove(Object obj)方法浅析

    博客分类:
  • java
阅读更多
今天改了一个bug,发现原来是原来程序员写的equals方法有点问题,实在问题很多。

顺便看了一下ArrayList的remove(Object obj)方法,不妨来看一下,以下是remove方法:
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;
    }


这段的remove方法特有意思,竟然也能够擦除list中值为null的元素!测试代码如下:
import java.util.ArrayList;

public class TestListNullRemove {
	public static void main(String[] args) {
		ArrayList<String> list=new ArrayList<String>();
		list.add("s1");
		list.add("s2");
		list.add(null);
		list.add("s3");
		list.add("s4");

		System.out.println("before remove list size:"+list.size());
		for(Object obj:list)
			System.out.println(obj);
		System.out.println();
		
		list.remove(null);
		
		System.out.println("after remove list size:"+list.size());
		for(Object obj:list)
			System.out.println(obj);
	}
}



当然当传进来的元素不为null时,首先调用的是元素的equals方法,相等时才能调用fastRemove方法。
接下来remove方法主要调用了fastRemove方法,那么fastRemove方法又做了什么呢?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; // Let gc do its work
    }


可以看出来,ArrayList用了一个数组(ArrayList吗,呵呵)保存值引用,不过这段代码牛B的地方有两处,一是直接将要移动的元素后面的元素直接用数组拷贝前移(保持元素的连续性),另一处是最后一行代码:
 elementData[--size] = null;
这段代码的作用是将元素引用置为null,这样做的目的是避免内存泄漏(否则实际上数组中依然有该引用,gc无法进行垃圾回收,类似Java中堆栈数据结构的实现方式),perfect!

应该说Java的类库是一座大宝藏,但如果自己时候功力不够的话,代码虽然能看得懂,但不一定能懂得妙处,自己浸淫好久了,现在对类库体会越来越深了,hehe!
分享到:
评论

相关推荐

    Java中ArrayList的removeAll方法详解

    ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为它可能会导致性能问题。 1. ...

    Java中ArrayList的使用方法以及与vector的对比

    Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...

    java中ArrayList的用法

    ### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...

    Java中ArrayList的使用方法简单介绍

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。ArrayList主要用于存储一组有序的、可变大小的对象序列。它的特点是允许快速的随机访问,但插入和删除元素时效率相对较低,因为...

    java ArrayList.remove()的三种错误用法以及六种正确用法详解

    ArrayList的remove()方法是一个关键功能,用于删除列表中的元素。然而,如果不正确地使用这个方法,可能会导致程序运行错误或预期之外的结果。以下是对`java ArrayList.remove()`的三种错误用法以及六种正确用法的...

    试谈Java中ArrayList类的使用.pdf

    * `remove(Object o)`: 移除 ArrayList 中首次出现的指定元素。 * `clear()`: 移除 ArrayList 中所有元素。 获取元素 ArrayList 类提供了两种获取元素的方法: * `size()`: 返回 ArrayList 中的元素数量。 * `get...

    java中对ArrayList进行排序

    java中对ArrayList进行排序的方法参考

    Java中ArrayList类的用法.docx

    ### Java中ArrayList类的用法详解 #### 一、ArrayList的概念 `ArrayList`是Java集合框架中的一个重要组成部分,它提供了一种类似于数组的数据结构,但与传统的数组相比,`ArrayList`具有更多的灵活性。它可以动态地...

    Java中ArrayList在foreach里remove的问题详析

    " Java中ArrayList在foreach里remove的问题详析 " 在Java中,ArrayList是一个动态数组,它提供了动态的增加和减少元素的功能,並实现了ICollection和IList接口。然而,在使用foreach循环时,ArrayList不能add元素,...

    java中ArrayList 、LinkList区别.doc

    在Java编程语言中,ArrayList和LinkedList都是集合框架中两种重要的数据结构,它们分别基于不同的底层实现,具有不同的特性和性能特点。以下是对这两个类的详细分析: 1. **ArrayList 实现**: - ArrayList 实现了...

    Java中ArrayList类的用法.pdf

    Java中的ArrayList类是Java集合框架的一部分,它是基于数组实现的可变大小的列表。ArrayList类在编程中扮演着重要角色,因为它提供了动态增加和减少元素的能力,这比传统的固定大小的数组更加灵活。ArrayList实现了...

    Java中ArrayList类的用法知识.pdf

    Java中的ArrayList类是Java集合框架的一部分,它是List接口的一个实现,主要用于存储可变大小的有序对象集合。ArrayList基于数组实现,允许动态地增加或减少元素,提供了丰富的操作方法,适用于需要频繁增删元素的...

    Java中ArrayList去除重复元素(包括字符串和自定义对象)

    在去除ArrayList中重复自定义对象元素时,我们需要重写equals方法,因为contains方法和remove方法都依赖于equals方法。下面是一个示例代码: ```java public class Person { private String name; private int ...

    java关键字ArrayList详解

    ArrayList是Java集合框架中的一种重要实现,它是List接口的一个具体类,主要特点是基于数组实现,提供了灵活的元素存储和操作。ArrayList支持动态扩容,可以根据需要自动增加数组的大小,这使得在不知道确切元素数量...

    Java中ArrayList类的使用方法

    ArrayList是Java中常用的一种集合类,它是基于动态数组实现的,允许我们在运行时灵活地添加、删除或修改元素。ArrayList类是Java集合框架的一部分,它实现了List接口,因此也遵循了列表的所有规则。 1. **ArrayList...

    java arrayList遍历的四种方法及Java中ArrayList类的用法

    Java中的ArrayList是一个非常重要的数据结构,它作为动态数组,提供了比传统数组更强大的功能和灵活性。ArrayList类位于java.util包中,它实现了List接口,因此它支持有序的元素集合,并且允许重复元素。以下是...

    模拟java ArrayList Iterator

    在Java中,ArrayList类继承自AbstractList接口,并实现了List接口,提供了丰富的操作方法,如add、remove、get等。 Iterator设计模式是一种行为设计模式,它的主要作用是为集合提供一种顺序访问元素的方式,而无需...

    jni操作arraylist对象

    3. **创建int类型的Java对象**:由于ArrayList的`add`方法期望一个Object参数,我们需要将int值转换为Integer对象。为此,我们需要使用`env-&gt;NewObject`方法创建一个Integer对象。 ```c++ jclass integerClass = ...

    浅析ArrayList内部实现

    浅析ArrayList内部实现 ArrayList是Java集合框架中的一种常用数据结构,能够存储任意多个对象,并且可以自由扩展,弥补了数组的定长的缺陷。下面我们将深入探讨ArrayList的内部实现机理。 ArrayList的内部实现机理...

Global site tag (gtag.js) - Google Analytics