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