码迷,mamicode.com
首页 > 编程语言 > 详细

java集合类源码分析之Map(一)

时间:2017-10-08 18:52:47      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:new   soft   hash   microsoft   enter   ati   als   object   修改   

  java集合中Map接口的实现类有HashMap、Hashtable、LinkedHashMap和TreeMap,与List不同的是Map并不是继承自Collection接口。可以这样来理解它:

  • Map提供key到value的映射,一个Map中不能包含相同的key,每个key只能映射一个 value。
  • Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射

 1.HashMap

  • HashMap的基本实现为一个链表数组(Entry<K, V>[ ]),即存放链表的数组,数组中的每个元素都是一个链表的头结点,而链表中的基本数据类型是一个静态内部类(Node)的对象,这些对象都具有相同的hash(key)值,所以是一种无序存储。
技术分享
 1     static class Node<K,V> implements Map.Entry<K,V> {
 2         final int hash;
 3         final K key;
 4         V value;
 5         Node<K,V> next;
 6 
 7         Node(int hash, K key, V value, Node<K,V> next) {
 8             this.hash = hash;
 9             this.key = key;
10             this.value = value;
11             this.next = next;
12         }
13 
14         public final K getKey()        { return key; }
15         public final V getValue()      { return value; }
16         public final String toString() { return key + "=" + value; }
17 
18         public final int hashCode() {
19             return Objects.hashCode(key) ^ Objects.hashCode(value);
20         }
21 
22         public final V setValue(V newValue) {
23             V oldValue = value;
24             value = newValue;
25             return oldValue;
26         }
27 
28         public final boolean equals(Object o) {
29             if (o == this)
30                 return true;
31             if (o instanceof Map.Entry) {
32                 Map.Entry<?,?> e = (Map.Entry<?,?>)o;
33                 if (Objects.equals(key, e.getKey()) &&
34                     Objects.equals(value, e.getValue()))
35                     return true;
36             }
37             return false;
38         }
39     }
View Code
  • HashMap 的实例有两个参数影响其性能:初始容量(默认16)加载因子(默认0.75)。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是描述哈希表在扩容之前可以达到多满的一种度量。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。因此,HashMap的容量并不等于能够存储的对象的个数

  • 因此,在创建实例的时候我们要按照自己的需求来设置这两个值,当空间大而对查询效率要求高的时候可以将初始容量设置的大一些,而加载因子小一些这样的话查询效率高,但空间利用率不高,而当空间比较小而效率要求不是很高的时候可以将初始容量设置小一些而加载因子设置大一些,这样查询速度会慢一些而空间利用率会高一些。

  • 按照key关键字的哈希值和buckets数组的长度取模(hash(key)%length)查找桶的位置,如果key的哈希值相同,Hash冲突(指向了同一个桶)则每次新添加的作为头节点,而最先添加的在表尾。

                          技术分享                          技术分享

图片来自:http://blog.csdn.net/qh_java/article/details/46404439                                  图片来自:http://blog.csdn.net/qh_java/article/details/46404439

下面通过源码来进行分析,了解HashMap的一些基本用法:

  • 构造器(四种)

1.HashMap(int initialCapacity, float loadFactor) 第一个参数为初始容量,第二个参数为加载因子

2.HashMap(int initialCapacity) 只初始化容量,加载因子为默认值0.75

3. HashMap() 空的构造器,加载因子为默认值0.75

4.HashMap(Map<? extends K, ? extends V> m) 初始化HashMap中的元素,加载因子默认0.75

  • 插入元素

1.put(K key, V value) 插入单个map元素

2. putAll(Map<? extends K, ? extends V> m) 插入一个map集合

技术分享
1         //hashMap默认按key的哈希值存储,所以是一种无序存储
2         hashMap.put("A", 100);
3         hashMap.put("B", 120);
4         hashMap.put("C", 105);
5         for(String key: hashMap.keySet()){
6             System.out.print(key+":"+hashMap.get(key)+", ");
7         }//A:100, B:120, C:105, 
View Code
  • 查找元素

1.get(Object key) 按key值查找相应的value值

2.containsKey(Object key) 查找map中是否含有指定的key

3.containsValue(Object value) 查找map中是否含有指定的value

技术分享
1         System.out.println(hashMap.get("A"));//100
2         System.out.println(hashMap.containsKey("A"));//true
3         System.out.println(hashMap.containsValue(100));//true
View Code
  • 修改元素

1.put(K key, V value) 找到key值相同的value,用新的value值进行覆盖

技术分享
1         hashMap.put("A", 500);
2         System.out.println(hashMap.get("A"));//500
View Code
  • 删除元素

1.remove(Object key) 按key查找,将相应的key-value对删除

2.clear() 清空map中的所有元素

技术分享
1         System.out.println(hashMap.size());//4
2         hashMap.remove("D");
3         System.out.println(hashMap.containsKey("D"));//false
4         System.out.println(hashMap.size());//3
View Code

 

2.TreeMap

  • TreeMap的基本实现是一棵红黑二叉树,按照key值以二叉树的顺序进行存储,所以是一种有序存储。

 

java集合类源码分析之Map(一)

标签:new   soft   hash   microsoft   enter   ati   als   object   修改   

原文地址:http://www.cnblogs.com/Wilange/p/7636923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!