Map以及HashMap
Posted liushiqiang123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map以及HashMap相关的知识,希望对你有一定的参考价值。
本文主要介绍java集合框架的Map集合,在日常生活中Map的运用也十分广泛。
与List集合、Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口。
重要的是,Map集合提供了一个不一样的元素存储方法,利用“key—value”的形式进行存储。其中,每个键映射一个值。而在Set集合中,元素的存储就是利用Map的这一特性来实现。
简单的介绍了下Map集合,接下来,就让笔者对其主要实现类HashMap、TreeMap、HashTable进行详细的说明。
1 Map常用方法
具体介绍之前,我们先了解下Map接口本身,一边了解所有实现的共同点。
1 public interface Map<K,V> 2 3 //返回Map中的key--value的数目 4 int size(); 5 6 //如果Map不包含任何key--value,则返回 true 7 boolean isEmpty(); 8 9 //如果Map中包含指定key的映射,则返回true 10 boolean containsKey(Object key); 11 12 //如果此Map将一个或多个键映射到指定值,则返回 true 13 boolean containsValue(Object value); 14 15 //返回与指定键关联的值 16 V get(Object key); 17 18 //将指定值与指定键相关联 19 V put(K key, V value); 20 21 //从Map中删除键和关联的值 22 V remove(Object key); 23 24 //将指定Map中的所有映射复制到此map 25 void putAll(java.util.Map<? extends K, ? extends V> m); 26 27 //从Map中删除所有映射 28 void clear(); 29 30 //返回Map中所包含键的Set集合 31 Set<K> keySet(); 32 33 //返回 map 中所包含值的 Collection集合。 34 Collection<V> values(); 35 36 //返回Map中所包含映射的Set视图。Set中的每个元素都是一个 Map.Entry 对象 37 Set<java.util.Map.Entry<K, V>> entrySet(); 38 39 //比较指定对象与此 Map 的等价性 40 boolean equals(Object o); 41 42 //返回此 Map 的哈希码 43 int hashCode(); 44 45 //Map集合中存储key--value的对象Entry,在Map集合内形成数组结构 46 interface Entry<K,V> 47 48 V getValue(); 49 50 V setValue(V value); 51 52 boolean equals(Object o); 53 54 int hashCode(); 55 56
2 HashMap
HashMap基于哈希表,底层结构由数组来实现,添加到集合中的元素以“key—value”形式保存到数组中,在数组中key—value被包装成一个实体来处理—-也就是上面Map接口中的Entry。
在HashMap中,Entry[]保存了集合中所有的键值对,当我们需要快速存储、获取、删除集合中的元素时,HashMap会根据hash算法来获得“键值对”在数组中存在的位置,以来实现对应的操作方法。
此时,细心的朋友可能会问,既然是基于哈希表的实现,那么当新增的元素出现了hash值重复了怎么办,怎么插入呢?
专业上来说,hash值重复的情况,我们称之为哈希碰撞(又或者哈希冲突)。在HashMap中,是通过链表的形式来解决的,在hash值重复的数组角标下,通过链表将新插入的元素依次排列,当然如果插入的key相同,那么我们会将新插入的value覆盖掉原有的value;
像上图所示,当产生了hash冲突后,会在产生冲突的角标下,生成链表,依次排列。
HashMap继承于AbstractMap,实现了Map, Cloneable, Serializable接口。
(1)HashMap继承AbstractMap,得到了Map接口中定义方法的实现,减少实现Map接口所需的工作;
(2)HashMap实现Map,得到了Map接口定义的所有方法,其中一部分AbstractMap已实现;
(3)HashMap实现Cloneable,得到了clone()方法,可以实现克隆功能;
(4)HashMap实现Serializable,表示可以被序列化,通过序列化去传输,典型的应用就是hessian协议。
它具有如下特点:
-
允许存入null键,null值(null值只有一个,并存于数组第一个位置)
-
无序集合,而且顺序会随着元素的添加而随时改变(添加顺序,迭代顺序不一致)
-
随着元素的增加而动态扩容(与ArrayList原理一致)
-
不存在重复元素(得益于hashCode算法和equals方法)
-
线程不安全
3 HashMap基本操作
1 public static void main(String[] agrs) 2 //创建HashMap集合: 3 Map<String,String> map = new HashMap<String,String>(); 4 System.out.println("HashMap元素大小:"+map.size()); 5 6 //元素添加: 7 map.put("hi","hello"); 8 map.put("my","hello"); 9 map.put("name","hello"); 10 map.put("is","hello"); 11 map.put("jiaboyan","hello"); 12 13 //遍历1:获取key的Set集合 14 for(String key:map.keySet()) 15 System.out.println("map的key是:"+key); 16 System.out.println("map的value是:"+map.get(key)); 17 18 19 //遍历2:得到Set集合迭代器 20 Set<Map.Entry<String,String>> mapSet1 = map.entrySet(); 21 Iterator<Map.Entry<String,String>> iterator = mapSet1.iterator(); 22 while(iterator.hasNext()) 23 Map.Entry<String,String> mapEntry = iterator.next(); 24 System.out.println("map的key是:" + mapEntry.getKey()); 25 System.out.println("map的value是:" + mapEntry.getValue()); 26 27 28 //遍历3:转换成Set集合,增强for循环 29 Set<Map.Entry<String,String>> mapSet2 = map.entrySet(); 30 for(Map.Entry<String,String> mapEntry : mapSet2) 31 System.out.println("map的key是:" + mapEntry.getKey()); 32 System.out.println("map的value是:" + mapEntry.getValue()); 33 34 35 //元素获取:通过key获取value 36 String keyValue = map.get("jiaboyan"); 37 System.out.println("HashMap的key对应的value:" + keyValue); 38 39 //元素替换:map没有提供直接set方法,而是使用新增来完成更新操作 40 map.put("jiaboyan","helloworld"); 41 System.out.println("HashMap的key对应的value:" + map.get("jiaboyan")); 42 43 //元素删除: 44 String value = map.remove("jiaboyan"); 45 System.out.println("HashMap集合中被删除元素的value" + value); 46 //清空所有元素: 47 map.clear(); 48 49 //hashMap是否包含某个key: 50 boolean isContain = map.containsKey("hello"); 51 //hashMap是否为空: 52 boolean isEmpty = map.isEmpty(); 53
以上是关于Map以及HashMap的主要内容,如果未能解决你的问题,请参考以下文章