list的remove,list的remove不报错

http://www.itjxue.com  2023-01-15 11:42  来源:未知  点击次数: 

如何删除一个list中最后一个元素

1、python删除列表中指定元素的方法。

2、代码实例,创建一个列表。

3、打印定义的列表,使用print()。

4、删除列表中的指定元素,使用remove()。

5、再次打印删除元素后的列表。

6、列表的remove()方法其他注意事项。

java list中的 remove要自己实现吗

list 是个接口 ,remove是个抽象方法 ,一般不用自己实现 ,最常用的就是ArrayList

下面是源码

public Object remove(int i)

{

rangeCheck(i);

modCount++;

Object obj = elementData(i);

int j = size - i - 1;

if(j 0)

System.arraycopy(((Object) (elementData)), i + 1, ((Object) (elementData)), i, j);

elementData[--size] = null;

return obj;

}

public boolean remove(Object obj)

{

if(obj == null)

{

for(int i = 0; i size; i++)

if(elementData[i] == null)

{

fastRemove(i);

return true;

}

} else

{

for(int j = 0; j size; j++)

if(obj.equals(elementData[j]))

{

fastRemove(j);

return true;

}

}

return false;

}

list.remove为什么报错

作为Java大家庭中的集合类框架,List应该是平时开发中最常用的,可能有这种需求,当集合中的某些元素符合一定条件时,想要删除这个元素。如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

// for循环优化写法,只获取一次长度

for(int i = 0, size = intList.size(); i size; i++) {

Integer value = intList.get(i);

// 符合条件,删除元素

if(value == 3 || value == 5) {

intList.remove(i);

}

}

System.out.println(intList);

}

}

执行后,会抛出IndexOutOfBoundsException,因为集合中存在符合条件的元素,删除后,集合长度动态改变,由于长度只获取一次,发生越界,所以,去掉for循环优化,如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

for(int i = 0; i intList.size(); i++) {

Integer value = intList.get(i);

// 符合条件,删除元素

if(value == 3 || value == 5) {

intList.remove(i);

}

}

System.out.println(intList);

}

}

输出:[1, 2, 5, 6],漏掉了5这个元素,当i=2的时候,值为3,删除后,后面的元素往前补一位,这时i=3的时候,值为6,跳过了5,这样也不行,随后想到了用for循环增强,不显示的操作下标,直接操作对象,如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

for(Integer value : intList) {

// 符合条件,删除元素

if(value == 3 || value == 5) {

intList.remove(value);

}

}

System.out.println(intList);

}

}

执行后,会抛出ConcurrentModificationException,字面意思是并发修改异常。异常跟踪信息如下:

Exception inthread "main" java.util.ConcurrentModificationException

atjava.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)

at java.util.AbstractList$Itr.next(AbstractList.java:420)

at ListTest.main(ListTest.java:13)

可以大概看出是执行到AbstractList中内部类Itr的checkForComodification方法抛出的异常,至于为什么出现异常,这里可以大概解释一下。集合遍历是使用Iterator, Iterator是工作在一个独立的线程中,并且拥有一个互斥锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast原则 Iterator 会马上抛出java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

而要解决这个问题,可以使用Iterator的remove方法,该方法会删除当前迭代对象的同时,维护索引的一致性。如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

IteratorInteger it = intList.iterator();

while(it.hasNext()) {

Integer value = it.next();

if(value == 3 || value == 5) {

it.remove();

}

}

System.out.println(intList);

}

}

输出正确结果:[1, 2, 6]。

不使用迭代器的解决方案就是,自己维护索引,删除一个元素后,索引-1,如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

for(int i = 0; i intList.size(); i++) {

Integer value = intList.get(i);

if(value == 3 || value == 5) {

intList.remove(i);

i--;

}

}

System.out.println(intList);

}

}

输出正确结果:[1, 2, 6]。

还有种取巧的方式是从最后一个元素开始遍历,符合条件的删除,如:

public class ListTest {

public static void main(String[] args) {

ListInteger intList = new ArrayListInteger();

Collections.addAll(intList, 1, 2, 3, 5, 6);

for(int i = intList.size() - 1; i = 0; i--) {

Integer value = intList.get(i);

if(value == 3 || value == 5) {

intList.remove(i);

}

}

System.out.println(intList);

}

}

输出正确结果:[1, 2, 6]。

最后,Java集合类框架真是大大方便了开发,不用自己去维护数组,随时担心着越界等问题。当然List的实现类对插入、删除的效率不太一样,这取决于其实现的数据结构,是选择删除,还是选择新建个集合,这里就不做讨论了。

java中list.remove方法使用

因为list是有顺序的,先add的编号就小(从0开始),这样就可以通过remove(编号)的形式进行删除,之后后面的会编号依次变小(也就是说编号总是连续的)。举例:

List

list

=

new

linkedList();

list.add("0");

list.add("1");

list.remove(0);

结果就是:list.get(0)

=1;

备注:如果再一次“list.remove(0);”那么list对象就是个空。

遍历list进行remove操作异常

产生问题:

在对list增强for循环进行遍历的时候,如果在不恰当的位置使用了remove,就会产生ConcurrentModificationException异常

产生原因:

java的foreach循环其实就是根据list对象创建一个Iterator迭代对象,然后针对Iterator进行遍历.遍历过程中会调用对应的hasNext和next方法

(1)ArrayList的hasnext和next 方法

? ?(2)LinkedList的hasnext和next 方法

两种list的iterator 都有一个方法是checkForComodification,目的是校验是否list被修改过。list中有个属性是modCount,记录着操作修改list的属性,如果操作list的add或remove,modCount属性都会进行+1的操作。

如果发生了修改,那么在下一次执行到这一步校验的时候,就会发现两个值不相等,抛出异常。

(责任编辑:IT教学网)

更多

相关网页背景文章

推荐网页背景文章