您的位置:首页 > 编程语言 > Java开发

【Array、List】Java数组或集合中如何删除元素

2017-09-07 23:15 806 查看
首先,数组的长度是固定的,你只可能抹掉一个元素,但是不能修改数组的长度;

一、普通for循环删除(不可行)

public class Test1 {
public static void main(String[] args) {
//目标:删除2;
Integer a[]={1,2,3};
for(int i =0;i<a.length;i++){
if (2==a[i]){
//这里,我们将等于2的那项设为null;
a[i]=null;
}
}
System.out.println(a);
}
}




这里,我们从控制台可以看到,原来下标为1的那个元素没有了,只有第0项和第2项了;我们修改下打印条件,可以看到,第0项,第1项和第2项分别为1,null,3;只是抹去了2,变为null;不算真正意义上的删除;



二、迭代器删除(可行)

public class Test1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
list.remove(0);
String str= iter.next();
System.out.println(list);
}
}
}


按照这种方法走下来,我们报错了:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Test1.main(Test1.java:28)


这是因为对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。具体可以看这里



这里,从图中,我们可以看到迭代器有三个属性:

cursor:表示当前元素的下标index为0;

lastRet:表示上一个下标,为-1;即初始状态;

expectedModCont:表示这个迭代器期望的元素总个数;因为我们的list有3个元素,所以,迭代器期望个数也为3;

然后我们打印了下迭代器实例的对象和类型:

//迭代器实体,对我们没有太大意义:
java.util.ArrayList$Itr@123772c4

//迭代器类型:
class java.util.ArrayList$Itr




做完remove之后,还没有报错,一切正常,list集合也从3个变成了两个,元素删掉了,集合大小也变化了;

但是往下走就得报错了,怎么办?

我们修改下代码:

这里写代码片




这里加了一个条件判断:

if("aa".equals(str)){
iter.remove();
}




接下来就一切正常了,元素也删除了,List集合大小也变化了;完美;

完整代码:

public class Test1 {
public static void main(String[] args) {
//删除2;
// Integer a[]={1,2,3};
// for(int i =0;i<a.length;i++){
// if (2==a[i]){
// a[i]=null;
// }
// }
//System.out.println(a[0]);
//System.out.println(a[1]);
//System.out.println(a[2]);
//我们如果再往里添加元素;
ArrayList<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
//list.remove(0);
String str= iter.next();
if("aa".equals(str)){ iter.remove(); }
System.out.println("str:"+str);
}
System.out.println(list);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: