Java——(七)Map之HashMap和Hashtable实现类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Map

  Map用于具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,

另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许

重复,即同一个Map对象的任何两个key通过equals()方法比较总是返回false。

  Set与Map之间的关系非常密切。虽然Map中放的元素是key—value对,Set集合中放的元素是

单个对象,但如果把key—value对中的value当成key的附庸:key在哪,value就在哪。这样就可以

像对待Set一样对待Map了。Map提供了一个Entry内部类来封装key—value对,而计算Entry存储时

则只考虑Entry封装的key。当Map中的所有元素value都为null时,就实现了Set集合。

  Map接口中定义了如下常用的方法:

1)void clear():删除该Map对象中的所有key—value对。

2)boolean containsKey(Object key):查询Map中是否包含指定的key,如果包含则返回true。

3)boolean containsValue(Object value):查询Map中是否包含一个或多个value,如果包含则返回true。

4)Set entrySet():返回Map中包含的key—value对所组成的Set集合,每个集合元素都是Map。Entry对象。

5)Object get(Object key):返回指定key所对应的value;如果此Map中不包含该key,则返回null。
6)boolean isEmpty():查询该Map是否为空(即不包含任何key—value对),如果为空,则返回true。
7)Set keySet():返回该Map中所有key组成的Set集合。

8)Object put(Object key, Object value):添加一个key—value对,如果当前Map中已有一个与该key相等的

key—value对,则新的key—value会覆盖原来的key—value对。

9)void putAll(Map m):将指定Map中的key—value对复制到本Map中。

10)Object remove(Object o):删除指定key所对应的key—value对,返回被删除key所关联的value,如果该key不存

在,则返回null。

11)int size():返回该Map里的key—value对的个数。

12)Collection values():返回该Map里所有value组成的Collection。

  Map接口提供了大量的实现类,典型实现如HashMap和Hashtable等、HashMap的子类LinkedHashMap,还有

SortedMap子接口及该接口的实现类TreeMap,以及WeakHashMap、IdentityHashMap等。下面将详细介绍Map

接口实现类。

  Map中包含一个内部类Entry,该类封装了一个key—value对。Entry包含如下三个方法:

  1)Object getKey():返回该Entry里包含的key值。

  2)Object getValue():返回该Entry里包含的value值。

  3)Object setValue(V value):设置该Entry了包含的value值,并返回新设置的value值。

1.HashMap和Hashtable实现类

  HashMap和Hashtable都是Map接口的典型实现类,它们之间的关系完全类似于ArrayList和Vector的关系:Hashtable

是一个古老的Map实现类。

  HashMap和Hashtable存在典型区别。

  1)Hashtable是一个线程安全的Map实现,但hashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点

;但如果有多个线程访问同一个Map对象时,使用Hashtable实现类会更好。

  2)Hashtable不允许使用null作为key和value,如果试图把null值放入Hashtable中,将会引发NullPointerException

异常;但HashMap可以使用null作为key和value。

  下面程序示范了用null值作为HashMap的key和value的情况。

 1 import java.util.HashMap;
 2
 3
 4 public class NullInHashMap {
 5
 6     public static void main(String[] args) {
 7
 8         HashMap hMap = new HashMap<>();
 9         //试图将两个key为null值的key—value对放入HashMap中
10         hMap.put(null, null);
11         hMap.put(null, null);
12         //将一个value为null值的key—value对放入HashMap中
13         hMap.put("a", null);
14         System.out.println(hMap);
15     }
16
17 }

运行结果:

{null=null, a=null}

  与HashSet集合不能保证元素的顺序一样,HashMap、Hashtable也不能保证其中key—value

对的顺序。类似于HashSet,HashMap、Hashtable判断两个key相等的标准也是:两个key通过

equals()方法比较返回true,两个key的hashCode值也相等。此外,HashMap、Hashtable中还包

含指定的value。只有两个对象通过equals()方法比较返回true即可。下面程序示范了Hashtable判断

两个key相等的标准和两个value相等的标准。

 1 import java.util.Hashtable;
 2
 3 class A {
 4     int count;
 5
 6     public A(int count) {
 7         this.count = count;
 8     }
 9
10     @Override
11     public boolean equals(Object obj) {
12
13         if (obj == this) {
14             return true;
15         }
16         if (obj != null && obj.getClass() == A.class) {
17             A a = (A) obj;
18             return this.count == a.count;
19         }
20         return false;
21     }
22
23     @Override
24     public int hashCode() {
25         return this.count;
26     }
27 }
28
29 class B {
30     @Override
31     public boolean equals(Object obj) {
32
33         return true;
34     }
35 }
36
37 public class HashtableTest {
38
39     public static void main(String[] args) {
40
41         Hashtable ht = new Hashtable<>();
42         ht.put(new A(60), "黑马程序员");
43         ht.put(new A(52), "传智播客");
44         ht.put(new A(78), "CSDN");
45         ht.put(new A(60), new B());
46         System.out.println(ht);
47         /*只要两个对象通过equals()方法比较返回true,Hashtable就认为
48          * 它们是相等的value,由于Hashtable中有一个B对象,它与任何
49          * 对象通过equals()方法比较都相等,所以下面输出true*/
50         System.out.println(ht.containsValue("测试字符串"));
51         /*只要两个A对象的count对象相等,它们通过equals()方法比较返回
52          * true,且hashCode值相等,Hashtable即认为它们是相等的key,
53          * 所以输出true*/
54         System.out.println(ht.containsKey(new A(52)));
55         //删除最后一个key—value对
56         ht.remove(new A(78));
57         //通过返回Hashtable返回的所有key组成的Set集合
58         //从而遍历Hashtable的每个key—value对
59         for (Object key : ht.keySet()) {
60             System.out.println(key + "---->");
61             System.out.println(ht.get(key) + "\n");
62         }
63     }
64
65 }

运行结果:

{[email protected]=传智播客, [email protected][email protected], [email protected]=CSDN}
true
true
[email protected]34---->
传智播客

[email protected]---->
[email protected]

上面程序定义了A类和B类,其中A类判断两个A对象相等的标准是count实例变量:只要两个A对象的

count变量相等,则通过equals()方法比较它们返回true,它们的hashCode值也相等;而B对象则可

以与任何对象相等。

时间: 2024-12-26 21:49:08

Java——(七)Map之HashMap和Hashtable实现类的相关文章

【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别. 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashSet.ArrayList,因为分不清楚它们之间的关系,所以在使用时经常会混淆,以至于不知道从何下手.在这儿作了一个小例

Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的key不容许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false. key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的.确定的value.从Map中取出数据时,只要给出指定的key,就可以取出对应的value. 如果把Map里的所有key放在一起看

Java中的集合Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap(五)

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的key不容许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false. key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的.确定的value.从Map中取出数据时,只要给出指定的key,就可以取出对应的value. 如果把Map里的所有key放在一起看

Java 集合系列 11 hashmap 和 hashtable 的区别

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和

java源码之HashMap和HashTable的异同

代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从时间的维度上来看,HashMap要比HashTable出现得晚一些. 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal G

JAVA数据结构——Map之HashMap

JAVA数据结构--Map之HashMap 一.原型及简介 原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 简介:HashMap基于散列表实现的一个key-value数据结构,能够实现通过key值快速查找.HashMap继承自AbstractMap抽闲类,实现了Map接口. 二.数据结构原理介绍 如下图所示,HashMap

Java中Map与HashMap,Hashtable,HashSet的区别

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对):HashSet则实现了Set接口,性质类似于集合. HashTable和HashMap区别 一.继承的父类不同 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类.但二者都实现了Map接口. 二.线程安全性不同 Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的.在多线程并发的环境下

浅析Java中Map与HashMap,Hashtable,HashSet的区别(转载)

HashMap和Hashtable两个类都实现了Map接口,二者保存K-V对(key-value对):HashSet则实现了Set接口,性质类似于集合 HashTable和HashMap区别 第一,继承的父类不同.Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类.但二者都实现了Map接口. public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>

Java容器深入浅出之Map、HashMap、Hashtable及其它实现类

在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集合具有如下的一些特点: 1. Key集因为是Set的实现,因此是无顺序.不可重复的. 2. Value集是List的实现,因此是可以重复的,每个元素根据key来索引. 3. Map内部包含一个Entry内部接口,用于定义key-value对,由实现类来对外提供查找和设置value的方法. Map的基