public boolean remove(Object o)
的List
方法从列表中删除了一个对象,但没有移动后面的元素。只是使对象值为空。
恕我直言,这是一个不直观的设计选择,因为清单前后的清单大小保持不变
是否有一种优雅的方法来获取一个包含元素移动的列表?
由于
答案 0 :(得分:4)
不,这不是它的作用。该元素被删除,其后面的所有索引都减少了一个。是什么让你认为它的行为不同?
答案 1 :(得分:3)
根据Java API here,可以看出List DOES的remove函数移位
删除此列表中指定位置的元素(可选操作)。将任何后续元素向左移位(从索引中减去一个)。返回从列表中删除的元素。
编辑:
主要课程:
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<A> x = new ArrayList<A>();
A one = new A("one");
A two = new A("two");
A three = new A("three");
A four = new A("four");
A five = new A("five");
A six = new A("six");
A seven = new A("seven");
A eight = new A("eight");
A nine = new A("nine");
A ten = new A("ten");
x.add(one);
x.add(two);
x.add(three);
x.add(four);
x.add(five);
x.add(six);
x.add(seven);
x.add(eight);
x.add(nine);
x.add(ten);
for(A item:x){
System.out.println(item.getStr());
}
x.remove(four);
Iterator<A> i = x.iterator();
while(i.hasNext()){
A item = i.next();
System.out.println(item.getStr());
}
}
}
A级:
public class A {
private String str;
public A(String x){
this.str = x;
}
public String getStr(){
return this.str;
}
}
完美无缺!没有空指针异常。 这是应该怎么做的。第一个For循环是我对Iterator对象所做的替代语法。实际上,Java会自动将第一个for循环转换为看起来像while循环的东西。
答案 2 :(得分:2)
如果查看ArrayList remove implementation,它使用本地方法fastRemove(index),如下所示: -
/ * *私有删除方法,跳过边界检查,但没有 *返回删除的值。 * /
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
}
它确实使用了arraycopy,它证明了你获得了全新的新鲜对象列表而不是填充之间的空值。这是证明吗?
答案 3 :(得分:1)
java.util.List
的合同意味着调用remove
将导致size()
递减。如果你专门讨论java.util.ArrayList
那么你可能对内部数组没有改变它的元素是正确的,但这是一个实现细节,在99%的情况下对你来说无关紧要。如果它仍然有用,那么您正在尝试针对特定情况进行优化,您应该实现自己的List
或使用类似java.util.LinkedList
的内容。
答案 4 :(得分:1)
您的观察结果是错误的,或者您正在使用其他类型的List实现(而不是ArrayList),这些实现不会将元素移动到要删除的元素的右侧。你可以发布你的代码吗?
如果查看JDK8中的java.util.ArrayList源代码,您将看到remove(Object o)方法有效地将元素右侧的元素复制到从索引开始的同一个数组中要删除的元素查看ArrayList source code以获取更多信息:
答案 5 :(得分:0)
如果您只需要一个数据数组,那么只需调用toArray()
。