关于HashSet与HashMap


package com.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapIteratorDemo {
	/*
	 * HashMap实现Map接口
	 * HashMap基于哈希表(数组+链表)实现
	 * 键和值可以使用null
	 * 非同步,线程不安全,无序
	 */
	public static void hashMapIterator(){
		HashMap<String,Test> h = new HashMap<>();
		Test t1 = new Test(1,"manu1",10);
		Test t2 = new Test(2,"manu2",20);
		Test t3 = new Test(3,"manu3",30);
		h.put("test1",t1);
		h.put("test2",t2);
		h.put("test3",t3);
		h.put("test4",t1);
		System.out.println("删除前的k-v数:"+h.size());
		h.remove("test1");//根据键移除指定的映射关系
		System.out.println("删除后的k-v数:"+h.size());
		t1.setId(5);
//		h.remove("test4");
		
		System.out.println("*********KeySet()*********");
		Set<String> sets = h.keySet();//获取映射中所有键的集合
		Iterator<String> i = sets.iterator();
		while(i.hasNext()){
			String keys = i.next();
			Test tests = h.get(keys);
			System.out.println(keys+"-->"+tests);//无序
		}
		System.out.println("*********entrySet()*********");
		Set<Map.Entry<String, Test>> kv = h.entrySet();//获取键值对
		Iterator<Entry<String, Test>> iter = kv.iterator();
		while(iter.hasNext()){
			System.out.println(iter.next());
		}
		System.out.println("*********values()*********");
		Collection<Test> co = h.values();//获取所有的值得集合
		Iterator<Test> ic = co.iterator();
		while(ic.hasNext()){
			Test t = ic.next();
			System.out.println(t);
		}
	}
	/*
	 * HashSet实现Set接口
	 * HashSet也是基于哈希表实现
	 * 允许使用null元素
	 * 非同步,线程不安全,无序
	 */
	public static void hashSetIterator(){
		HashSet<Test> h = new HashSet<>();
		Test t1 = new Test(1,"manu1",10);
		Test t2 = new Test(2,"manu2",20);
		h.add(t1);
		h.add(t2);
		System.out.println("*********Iterator*********");
		Iterator<Test> iter = h.iterator();
		while(iter.hasNext()){
			Test t = iter.next();
			System.out.println(t);
		}
		System.out.println("*********foreach*********");
		for (Test test : h) {
			System.out.println(test);
		}
		System.out.println("删除前:"+h.size());
		System.out.println("删除t1结果:"+h.remove(t1));
		System.out.println("删除后:"+h.size());
		/*
		 * 改变实例的属性后,
		 * 若在实例类中没有重写hashCode()方法,即使改变实例的属性值,其hash值也相同
		 * 因为Object中的hashCode()是native的,只与本地机器有关,所以,可以执行删除操作
		 * 若实例中重写hashCode()方法,由于改变了实例属性值,重写的hashCode()方法里,某些属性值
		 * 参与了hash值的计算,所以,改变属性值前后hash值也变化了,相当于在原来添加对象的位置找不到了,
		 * 故不能删除成功
		 */
		t2.setId(10);
		System.out.println("删除t2结果:"+h.remove(t2));
		System.out.println("删除后:"+h.size());
		
	} 
	public static void main(String[] args) {
		hashMapIterator();
		System.out.println(">>>>>>>>>>test>>>>>>>>>>");
		hashSetIterator();
	}
}

运行结果:

删除前的k-v数:4
删除后的k-v数:3
*********KeySet()*********
test4-->id=5, name=manu1, age=10
test2-->id=2, name=manu2, age=20
test3-->id=3, name=manu3, age=30
*********entrySet()*********
test4=id=5, name=manu1, age=10
test2=id=2, name=manu2, age=20
test3=id=3, name=manu3, age=30
*********values()*********
id=5, name=manu1, age=10
id=2, name=manu2, age=20
id=3, name=manu3, age=30
>>>>>>>>>>test>>>>>>>>>>
*********Iterator*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
*********foreach*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
删除前:2
删除t1结果:true
删除后:1
删除t2结果:false
删除后:1





原文地址:https://www.cnblogs.com/jzmanu/p/10284795.html