Java集合删除元素ArrayList实例详解
java集合删除元素arraylist实例详解
abstractcollection集合类中有一个remove方法,该方法为了适配多种不同的集合,允许删除空的元素,看这部分代码的时候产生了疑问,为什么这里直接用it.remove()就直接删除了?
public boolean remove(object o) { iterator<e> it = iterator(); if (o==null) { while (it.hasnext()) { if (it.next()==null) { it.remove(); return true; } } } else { while (it.hasnext()) { if (o.equals(it.next())) { it.remove(); return true; } } } return false; }
接下来,拿arraylist为例子,进行说明。其继承结构如下图所示。并且,arraylist内部有其使用的iterator的实现类。
编写一段测试代码:
abstractcollection<string> list = new arraylist<>(); list.add("a"); list.add(null); list.add(null); iterator<string> iter = list.iterator(); while(iter.hasnext()) { if(iter.next() == null) { iter.remove(); } } system.out.println(list);
关键点还是在于iter.next() == null 这一行,next的源码如下:
public e next() { checkforcomodification(); int i = cursor; if (i >= size) throw new nosuchelementexception(); object[] elementdata = arraylist.this.elementdata; if (i >= elementdata.length) throw new concurrentmodificationexception(); cursor = i + 1; return (e) elementdata[lastret = i]; }
cusor在这里表示的是遍历时的索引,在调用next方法的时候其实cusor已经指向了当前元素的下一个元素,而使用lasrret来获取当前的索引上的数据并将其返回。
而remove()方法中是通过lastret的索引进行删除的。
public void remove() { if (lastret < 0) throw new illegalstateexception(); checkforcomodification(); try { arraylist.this.remove(lastret); cursor = lastret; lastret = -1; expectedmodcount = modcount; } catch (indexoutofboundsexception ex) { throw new concurrentmodificationexception(); } }
借助上文中提到的测试实例,可以进行每一步的推算。
1. 调用next()方法,cursor指向0号元素,i被赋值为cursor的值,然后cursor被修改为i+1,指向了1号元素,也就是null所在的位置, lastret被赋值为0。
2. 调用next()方法,cursor指向了1号元素,赋值给i,然后cursor又通过i+1递增变为2,lastret被赋值为1
3. 执行删除,删除该集合lastret上所代表的元素。删除完成后修改cursor指针同时使得expectedmodcount和modcount保持一致避免fastfail。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: 对于ConvLSTM的理解
下一篇: 浅谈junit4单元测试高级用法