java集合类遍历删除方法测试以及使用场景记录

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
	 * 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);
	}

}

  

时间: 2024-10-10 21:06:38

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

java List遍历的方法

List可以用序号来遍历,但通常推荐使用iterator来遍历Iterator itr = list.iterator();while (itr.hasNext()) { Object nextObj = itr.next();} 如果要全部删除,用clear()方法是最简单的.另外,Iterator也带有remove()方法,可以在遍历的时候,根据一定条件来进行删除. 示例: import java.util.*; public class Test { public static void

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

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

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

在使用集合的过程中,我们经常会有遍历集合元素,删除指定的元素的需求,而对于这种需求我们往往使用会犯些小错误,导致程序抛异常或者与预期结果不对,本人很早之前就遇到过这个坑,当时没注意总结,结果前段时间又遇到了这个问题,因此,总结下遍历集合的同时如何删除集合中指定的元素: 1.错误场景复原 public class ListRemoveTest { public static void main(String[] args) { List<User> users = new ArrayList&l

java子类重写父类方法测试

父类 package com.yjm.Tes; public abstract class Ts { protected void Test(String str ,String s){ System.out.println("ts..."); } } 子类 package com.yjm.Tes; public class Test extends Ts { protected final void Test(String str, String s) { System.out.pr

每日总结 - Java集合类ArrayList删除特定元素

在这次的项目开发中遇到动态的删除ArrayList中的一些元素. 正确的做法是: 1 for(int i = 0, len = list.size(); i < len; i++){ 2 if(list.get(i) == 1){ 3 list.remove(i); 4 len--; 5 i--; 6 } 7 } 更好的一个做法: List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象.所以我们还有一个更好的做法是: 1 It

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

首先,这是一个极其简单的问题,大牛可忽略,新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比较困惑,用哪种方式可以安全有效的实现遍历list删除某些特征元素? 方式: 方法1.普通for循环 遍历List,删List除自身 特征条目: 方法2.高级for循环 遍历List,删除List自身 特定条目: 方法3.引入参考List,for循环遍历删除原List 特定条目: 方法4.利用iterator 遍历删除List特

java 集合遍历时删除元素

本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import java.util.ArrayList; import java.util.Iterator; import java

Java中遍历Map对象的4种方法

在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等) 方法一 在for-each循环中使用entries来遍历 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. [java] view

Java - List遍历、判断、删除元素时的陷阱

开发中,常有“遍历集合,依次判断是否符合条件,如符合条件则删除当前元素”的场景,有一些陷阱常犯. 漏网之鱼 import java.util.ArrayList; import java.util.List; public class ListTest_Unwork { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"