关于HashSet与HashMap

来源:互联网 发布:淘宝没发票可以投诉吗 编辑:程序博客网 时间:2024/06/15 22:22

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=10test2-->id=2, name=manu2, age=20test3-->id=3, name=manu3, age=30*********entrySet()*********test4=id=5, name=manu1, age=10test2=id=2, name=manu2, age=20test3=id=3, name=manu3, age=30*********values()*********id=5, name=manu1, age=10id=2, name=manu2, age=20id=3, name=manu3, age=30>>>>>>>>>>test>>>>>>>>>>*********Iterator*********id=2, name=manu2, age=20id=1, name=manu1, age=10*********foreach*********id=2, name=manu2, age=20id=1, name=manu1, age=10删除前:2删除t1结果:true删除后:1删除t2结果:false删除后:1




0 0
原创粉丝点击