package test0;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList; /**
* 测试集合类遍历删除方法
* 目前是基本的遍历方式,没有包含java8里面的遍历方式
*/
public class Test2 { public static void main(String[] args) {
forEach();
operateList();
operateSet();
operateMap(); } /**
* JDK1.5中,应用新特性For-Each循环,通用遍历读取所有集合类的方法,但是不能删除,
* For-Each语法最终被编译器转为了对Iterator.next()的调用,所以应该和Iterator性能差不多
* 现在测试到数据量很大的时候,比如上千万数据时,性能差距才会出来
* 如果在遍历是修改集合类,将会抛出java.util.ConcurrentModificationException异常
* 例如:
* Exception in thread "main" java.util.ConcurrentModificationException
* at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
*at java.util.ArrayList$Itr.next(Unknown Source)
*at Test.main(Test.java:12)
*/
public static void forEach() {
// list
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(1);
arr.add(2);
for (Integer i : arr) {
System.out.println("for each list: " + i);
} // set
HashSet<Integer> hs = new HashSet<Integer>();
hs.add(3);
hs.add(4);
for (Integer i : hs) {
System.out.println("for each set: " + i);
} // map
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
hm.put(5, 5);
hm.put(6, 6);
for (Entry<Integer, Integer> entry : hm.entrySet()) {
System.out.println("for each map: <" + entry.getKey() + "," + entry.getValue() + ">");
} } /*
list接口复杂度
| Arraylist | LinkedList
------------------------------------------
get(index) | O(1) | O(n)
add(E) | O(n) | O(1)
add(E, index) | O(n) | O(n)
remove(index) | O(n) | O(n)
Iterator.remove() | O(n) | O(1)
Iterator.add(E) | O(n) | O(1) */ /**
* 操作list
* LinkedList 是链表形式,使用于 遍历list并删除元素方法2 效率更高
* ArrayList 是数组形式,两种方法差不了多少
*
*/
public static void operateList() {
final int size = 10;
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
list.add(3);
} // 遍历list并删除元素方法1
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i) == 3) {
list.remove(i);
}
} for (int i = 0; i < size; i++) {
list.add(3);
} // 遍历list并删除元素方法2
for (Iterator<Integer> it = list.iterator(); it.hasNext();) {
Integer e = it.next();
if (e.equals(3)) {
it.remove();
}
}
} /**
* 操作集合
*/
public static void operateSet() {
final int size = 10;
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < size; i++) {
set.add(i);
} // 遍历set并删除元素方法
for (Iterator<Integer> it = set.iterator(); it.hasNext();) {
Integer e = it.next();
if (e.equals(3) || e.equals(4)) {
it.remove();
}
}
} /**
* 操作map,根据需求选择遍历方法,少量数据时不好对比性能出差距,需要上百万数据才容易比较出效果
* 1.entrySet遍历法:key value都需要时:key value都一直需要取出来时使用性能更高
* 2. keySet遍历法:key value都需要时:主要使用key,少量使用value时使用性能更高
* 3.values遍历value,这个没有得到key,但是也是可以删除的:主要使用value时使用
*
* 注意:
* 由于HashMap使用hash算法存储,所以时间复杂度为O(1),
* 而TreeMap使用红黑树存储,时间复杂度为O(logN),
* 所以假如一直需要key value的话,TreeMap使用entrySet遍历法效率将更高,而HashMap性能区别没有那么明显
*/
public static void operateMap() {
final int size = 10;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < size; i++) {
map.put(i, i);
} // 1.entrySet遍历法
for (Iterator<Entry<Integer, Integer>> it = map.entrySet().iterator(); it.hasNext();) {
Entry<Integer, Integer> e = it.next();
Integer key = e.getKey();
Integer value = e.getValue();
if (key.equals(3) || key.equals(4)) {
it.remove();
}
} // 2. keySet遍历法
for (Iterator<Integer> it = map.keySet().iterator(); it.hasNext();) {
Integer key = it.next();
if (key.equals(5) || key.equals(6)) {
// Integer value = map.get(key);
it.remove();
}
} // 3.values遍历value,这个没有得到key,但是也是可以删除的
for (Iterator<Integer> it = map.values().iterator(); it.hasNext();) {
Integer value = it.next();
if (value.equals(7) || value.equals(8)) {
// Integer value = map.get(key);
it.remove();
}
}
System.out.println("operateMap: " + map);
} }

  

java集合类遍历删除方法测试以及使用场景记录的更多相关文章

  1. java数组遍历 删除remove

    package com.b; import java.util.ArrayList; //数组遍历删除,添加 public class Core2 { private String name; pri ...

  2. java List遍历的方法

    List可以用序号来遍历,但通常推荐使用iterator来遍历Iterator itr = list.iterator();while (itr.hasNext()) { Object nextObj ...

  3. Java Hashtable遍历与方法使用

    参考文档 我参考了Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例,阅读了jdk 1.8的源码 Hashtable的继承关系 Hashtable继承了Dictionary类, ...

  4. java集合遍历删除指定元素异常分析总结

    在使用集合的过程中,我们经常会有遍历集合元素,删除指定的元素的需求,而对于这种需求我们往往使用会犯些小错误,导致程序抛异常或者与预期结果不对,本人很早之前就遇到过这个坑,当时没注意总结,结果前段时间又 ...

  5. Java 循环遍历删除set list中的元素

    删除List和Set中的某些元素 错误代码的写法: Set<String> set = new HashSet<String>(); set.add("aaaaaa& ...

  6. java 数组遍历(方法内部的代码)

    //数组遍历(依次输出数组中的每一个元素)二维数组: int[][] arr={{1,2},{3,4,5},{6,7}}; for(int i=0;i<arr.length;i++){ for( ...

  7. 对JAVA集合进行遍历删除时务必要用迭代器

    java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...

  8. Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结

    首先.这是一个极其简单的问题,大牛可忽略.新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有 ...

  9. Java中遍历Map集合的四种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

随机推荐

  1. 分布式日志收集系统- Cloudera Flume 介绍

        Flume是Cloudera提供的日志收集系统,具有分布式.高可靠.高可用性等特点,对海量日志采集.聚合和传输, Flume支持在日志系统中定制各类数据发送方, 同时,Flume提供对数据进行 ...

  2. sql 成绩表 case then

    select * from  dbo.tb_Scroe select Name,(select count(*) from tb_Scroe where Name = t.Name and Scroe ...

  3. UIView的交换实现,子视图交替变换

    其中加了一些动画  2016-01-13 其中主要的方法有:Demo下载地址,Demo中有介绍:https://github.com/lizhaojie001/UIview.git

  4. 由WSDL文件生成WEB service server端C#程序(转)

    一般一个已经实现功能的WEB Server会发布自己的WSDL文件,供客户端生成代理类. 但有时是先有的server与client交互的接口定义(WSDL)文件,然后由server和client端分别 ...

  5. 在C#实现托盘效果(转)

    桌面程序的开发中,经常考虑能在状态栏实现托盘快捷操作,托盘程序的实现在API时代,还是相对复杂的,首先在MSDN中可以查看其函数细节, 然后在根据其要求的参数进行复杂的设置.      在.NET时代 ...

  6. C++程序设计实践指导1.9统计与替换字符串中的关键字改写要求实现

    改写要求1:将字符数组str改为字符指针p,动态开辟存储空间 改写要求2:增加统计关键字个数的函数void CountKeyWords() 改写要求3: 增加替换函数void FindKeyWords ...

  7. 关于cookie的使用

    cookie的属性 domain:域名,即cookie所能使用的范围,当然当前域下可以在当前域下cookie,还有一个就是该域名的父级域名(子级的域名下是可以访问父级域名下的cookie,父级域名是不 ...

  8. IE6、7 a链接内图片加滤镜后导致a标签链接失效问题解决

    今天在项目中遇到一个ie6.7浏览器下a链接失效的问题,查询大量资料,最终找到完美的解决方案,如下: 解决方法: 为a标签加样式{*background:url(#);*zoom:1;} 为img外部 ...

  9. 学习《Javascript权威指南》的第二章笔记

    1.Javascript区分大小写,但是HTML不区分大小写 2.JS会忽略标识之间的空格,多数情况下也会忽视换行符,所以要采用 整齐.一致的编码风格 3.//用作结尾的注释,/* 和 */可以当跨行 ...

  10. 英特尔发布全新英特尔® INDE 2015工具套件

    2014年10月15日,英特尔发布了全新的英特尔® Integrated Native Developer Experience 2015工具套件(简称英特尔® INDE).该产品提供了一系列最佳工具 ...