制作网站的app,杭州网络公司哪家服务比较好,网站开发工程师招聘信息,有免费的wordpress文章目录1、为什么删不干净倒序删迭代器lambda表达式删除为什么说数组边for循环遍历边删除会出现删不干净的情况1、为什么删不干净
先写一个例子#xff1a;可以先猜一下控制台会打印出什么内容#xff1f;
public class removeIterator {public static void main(String[]…
文章目录1、为什么删不干净倒序删迭代器lambda表达式删除为什么说数组边for循环遍历边删除会出现删不干净的情况1、为什么删不干净
先写一个例子可以先猜一下控制台会打印出什么内容
public class removeIterator {public static void main(String[] args) {//ArrayList的底层数据结构就是数组ListStringlistnew ArrayList();list.add(aaa);list.add(bbb);list.add(ccc);list.add(ddd);for(int i0;ilist.size();i){list.remove(i);}System.out.println(list.toString());}
}
公布答案 可以看到并没有全部移除掉猜对没。那这是为什么呢
一开始list中是这样的
当移除下标为0的元素后index11而元素bbb及之后的元素都向前移动了一位如下图 接下来要移除index1位置上的元素也就是移除ccc移除ccc后ddd的下标变为1而index12即不会移除ddd所以最后list剩下了bbb和ddd
那么如何才可以稳定的删除呢总结了以下三种方法
倒序删
倒序删不会出现上面例子中元素数组位置改变的情况。
public class removeIterator {public static void main(String[] args) {ListStringlistnew ArrayList();list.add(aaa);list.add(bbb);list.add(ccc);list.add(ddd);for(int ilist.size()-1;i0;i--){list.remove(i);}System.out.println(list.toString());}
}
结果
迭代器
使用 Iterator.remove() 方法 简单介绍一下这个方法
Collection接口实现了Iterable接口实现了Iterable接口的类可以拥有增强for循环Iterator的remove()方法优势 如果知道删除项的准确位置删除操作的开销小 不能对正在被遍历的集合进行改变addremoveclear等操作但是可以调用iterator中的remove方法进行删除
public class removeIterator {public static void main(String[] args) {ListStringlistnew ArrayList();list.add(aaa);list.add(bbb);list.add(ccc);list.add(ddd);IteratorString it list.iterator();while(it.hasNext()){it.next();it.remove();}System.out.println(list.toString());}
}-----结果-----
[]注如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法再调用remove都会报IllegalStateException。
lambda表达式删除
上面使用迭代器的方式虽然能够正常的删除列表中的元素但是不够优雅因为要写好几行的遍历代码显得略臃肿。能不能只用一行代码完成这个功能呢答案是可以的——使用Lambda表达式 删除指定条件的元素 public String getString(ListInteger list) {if (list null || list.isEmpty()) {return null;}list.removeIf(e - isNotValid(e));return list.stream().map(String::valueOf).collect(Collectors.joining(,));}private static Boolean isNotValid(Integer in) {if (in null) {//为空的为无效数字return true;}return false;}
//输入[1,2,3,null,5,null,7]
//输出1,2,3,5,7