今天改了一个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!
分享到:
相关推荐
ArrayList的removeAll方法是一个常用的集合操作方法,该方法可以从一个ArrayList中删除所有在另外一个集合中的元素。但是,在实际开发过程中,removeAll方法的使用需要 thận重,因为它可能会导致性能问题。 1. ...
Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...
### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...
在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。ArrayList主要用于存储一组有序的、可变大小的对象序列。它的特点是允许快速的随机访问,但插入和删除元素时效率相对较低,因为...
ArrayList的remove()方法是一个关键功能,用于删除列表中的元素。然而,如果不正确地使用这个方法,可能会导致程序运行错误或预期之外的结果。以下是对`java ArrayList.remove()`的三种错误用法以及六种正确用法的...
* `remove(Object o)`: 移除 ArrayList 中首次出现的指定元素。 * `clear()`: 移除 ArrayList 中所有元素。 获取元素 ArrayList 类提供了两种获取元素的方法: * `size()`: 返回 ArrayList 中的元素数量。 * `get...
java中对ArrayList进行排序的方法参考
### Java中ArrayList类的用法详解 #### 一、ArrayList的概念 `ArrayList`是Java集合框架中的一个重要组成部分,它提供了一种类似于数组的数据结构,但与传统的数组相比,`ArrayList`具有更多的灵活性。它可以动态地...
" Java中ArrayList在foreach里remove的问题详析 " 在Java中,ArrayList是一个动态数组,它提供了动态的增加和减少元素的功能,並实现了ICollection和IList接口。然而,在使用foreach循环时,ArrayList不能add元素,...
在Java编程语言中,ArrayList和LinkedList都是集合框架中两种重要的数据结构,它们分别基于不同的底层实现,具有不同的特性和性能特点。以下是对这两个类的详细分析: 1. **ArrayList 实现**: - ArrayList 实现了...
Java中的ArrayList类是Java集合框架的一部分,它是基于数组实现的可变大小的列表。ArrayList类在编程中扮演着重要角色,因为它提供了动态增加和减少元素的能力,这比传统的固定大小的数组更加灵活。ArrayList实现了...
Java中的ArrayList类是Java集合框架的一部分,它是List接口的一个实现,主要用于存储可变大小的有序对象集合。ArrayList基于数组实现,允许动态地增加或减少元素,提供了丰富的操作方法,适用于需要频繁增删元素的...
在去除ArrayList中重复自定义对象元素时,我们需要重写equals方法,因为contains方法和remove方法都依赖于equals方法。下面是一个示例代码: ```java public class Person { private String name; private int ...
ArrayList是Java集合框架中的一种重要实现,它是List接口的一个具体类,主要特点是基于数组实现,提供了灵活的元素存储和操作。ArrayList支持动态扩容,可以根据需要自动增加数组的大小,这使得在不知道确切元素数量...
ArrayList是Java中常用的一种集合类,它是基于动态数组实现的,允许我们在运行时灵活地添加、删除或修改元素。ArrayList类是Java集合框架的一部分,它实现了List接口,因此也遵循了列表的所有规则。 1. **ArrayList...
Java中的ArrayList是一个非常重要的数据结构,它作为动态数组,提供了比传统数组更强大的功能和灵活性。ArrayList类位于java.util包中,它实现了List接口,因此它支持有序的元素集合,并且允许重复元素。以下是...
在Java中,ArrayList类继承自AbstractList接口,并实现了List接口,提供了丰富的操作方法,如add、remove、get等。 Iterator设计模式是一种行为设计模式,它的主要作用是为集合提供一种顺序访问元素的方式,而无需...
3. **创建int类型的Java对象**:由于ArrayList的`add`方法期望一个Object参数,我们需要将int值转换为Integer对象。为此,我们需要使用`env->NewObject`方法创建一个Integer对象。 ```c++ jclass integerClass = ...
浅析ArrayList内部实现 ArrayList是Java集合框架中的一种常用数据结构,能够存储任意多个对象,并且可以自由扩展,弥补了数组的定长的缺陷。下面我们将深入探讨ArrayList的内部实现机理。 ArrayList的内部实现机理...