Java Map接口及其实现类原理解析
Map接口
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;
Map中的键值对以Entry类型的对象实例形式存在;
建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。
Map支持泛型,形式如:Map
Map中使用put(Kkey,Vvalue)方法添加
Map接口中定义的常用方法
具体使用在实现类中讨论
intsize();//获取Map集合大小(即元素数量) booleanisEmpty();//判断是否为空 booleancontainsKey(Objectkey);//判断是否包含某个键 booleancontainsValue(Objectvalue);//判断是否包含某个值 Vget(Objectkey);//获取某个键对应的值 Vput(Kkey,Vvalue);//添加键值对(K,V) Vremove(Objectkey);//移除某个键对应的键值对 voidputAll(Mapm);//添加另一个Map集合 voidclear();//清空所有键值对 SetkeySet();//获取键的集合 Collection values();//获取值的集合 Set >entrySet();//获取键值对实体的集合 interfaceEntry //Map中的内部接口
HashMap
基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。(除了非同步和允许使用null之外,HashMap类与Hashtable大致相同。)除实现了Map接口外还实现了Cloneable,Serializable,继承了AbstractMap抽象类
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
特点:
- 键无序,唯一,类似于Set集合
- 值有序,可重复,类似于List
- 底层数据结构是哈希表,保证键唯一
允许键为null,值为null
//HashMaphm=newHashMap (); //hm.put("2018050401",newStudent("2018050401","张三",18,80.0)); //hm.put("2018050402",newStudent("2018050402","李四",18,80.0)); //hm.put("2018050403",newStudent("2018050403","李四",18,80.0)); //hm.put("2018050404",newStudent("2018050404","王五",18,80.0)); //hm.put("2018050404",newStudent("2018050404","王五",18,80.0)); // ////方式一:通过键找值 //Set keys=hm.keySet(); //for(Stringkey:keys){ //Students=hm.get(key); //System.out.println(key+"|"+s.getId()+"|"+s.getName()+"|"+s.getAge()+"|"+s.getScore()); //} HashMap hm=newHashMap (); hm.put(newStudent("2018050401","张三",18,80.0),"2018050401"); hm.put(newStudent("2018050402","李四",18,80.0),"2018050402"); hm.put(newStudent("2018050403","李四",18,80.0),"2018050403"); hm.put(newStudent("2018050404","王五",18,80.0),"2018050404"); hm.put(newStudent("2018050404","王五",18,80.0),"2018050404"); //方式二:通过键值对对象找键找值 Set >keyValues=hm.entrySet(); for(Entry keyValue:keyValues){ Students=keyValue.getKey(); Stringvalue=keyValue.getValue(); System.out.println(s.getId()+"|"+s.getName()+"|"+s.getAge()+"|"+s.getScore()+"="+value); }
LinkedHashMap
Map接口的哈希表和链表实现,具有可预知的迭代顺序
特点:
- 键有序,唯一,
- 值有序,可重复,类似于List
底层数据结构是哈希表和链表,哈希表保证键唯一,链表保证键有序
LinkedHashMaplhm=newLinkedHashMap (); lhm.put(01,"张三1"); lhm.put(02,"张三2"); lhm.put(03,"张三3"); lhm.put(04,"张三4"); lhm.put(05,"张三5"); Set keys=lhm.keySet(); for(Integerkey:keys){ System.out.println(key+"|"+lhm.get(key)); }
TreeMap
基于红黑树(Red-Blacktree)的NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,
具体取决于使用的构造方法。
特点:
- 键可排序,唯一,
- 值有序,可重复,类似于List
- 底层数据结构是自平衡的二叉树,可排序
排序方式类似于TreeSet,分为自然排序和比较器排序,具体取决于使用的构造方法
TreeMaptm=newTreeMap (); tm.put(24,"Hello1"); tm.put(14,"Hello2"); tm.put(34,"Hello3"); tm.put(124,"Hello4"); tm.put(24,"Hello5"); tm.put(24,"Hello6"); tm.put(24,"Hello7"); tm.put(244,"Hello8"); tm.put(624,"Hello9"); tm.put(24,"Hello10"); Set keys=tm.keySet(); for(Integerkey:keys){ Stringvalue=tm.get(key); System.out.println(key+"|"+value); }
HashTable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值
特点:
- 不允许null键和null值
- 线程安全,效率低
HashMap和Hashtable的区别:
- HashMap是不安全的不同步的效率高的允许null键和null值
- Hashtable是安全的同步的效率低的不允许null键和null值
底层都是哈希表结构
Hashtablehashtable=newHashtable (); hashtable.put("刘备","孙尚香"); hashtable.put("孙策","大乔"); hashtable.put("周瑜","小乔"); hashtable.put("吕布","貂蝉"); System.out.println(hashtable); Enumeration keys=hashtable.keys(); while(keys.hasMoreElements()){ Stringkey=keys.nextElement(); Stringvalue=hashtable.get(key); System.out.println(key+"|"+value); }
WeakHashMap
以弱键实现的基于哈希表的Map。在WeakHashMap中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。
丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的Map实现有所不同。
WeakHashMapwhm=newWeakHashMap<>(); whm.put(newString("hello1"),"world1"); whm.put(newString("hello2"),"world2"); whm.put(newString("hello3"),"world3"); whm.put("hello4","world3"); System.out.println(whm); System.gc(); System.runFinalization(); System.out.println(whm);
键是枚举类型
EnumMapem=newEnumMap<>(Direction.class); em.put(Direction.UP,"向上移动"); em.put(Direction.DOWN,"向下移动"); em.put(Direction.LEFT,"向左移动"); em.put(Direction.RIGHT,"向右移动"); Set keys=em.keySet(); for(Directionkey:keys){ Stringvalue=em.get(key); System.out.println(key+"|"+value); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。