Java——(七)Map之HashMap和Hashtable实现类
2015-06-11 19:33
295 查看
------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的情况。
运行结果:
与HashSet集合不能保证元素的顺序一样,HashMap、Hashtable也不能保证其中key—value
对的顺序。类似于HashSet,HashMap、Hashtable判断两个key相等的标准也是:两个key通过
equals()方法比较返回true,两个key的hashCode值也相等。此外,HashMap、Hashtable中还包
含指定的value。只有两个对象通过equals()方法比较返回true即可。下面程序示范了Hashtable判断
两个key相等的标准和两个value相等的标准。
运行结果:
上面程序定义了A类和B类,其中A类判断两个A对象相等的标准是count实例变量:只要两个A对
象的count变量相等,则通过equals()方法比较它们返回true,它们的hashCode值也相等;而B对象
则可以与任何对象相等。
与HashSet类似,如果使用可变对象作为HashMap、Hashtable的key,并且程序修改了作为key
的可变对象,则也可能出现于HashSet类似的情况:程序再也无法准确访问到Map中被修改过的key。
以下程序示范了上述情况。
运行结果:
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的情况。
import java.util.HashMap; public class NullInHashMap { public static void main(String[] args) { HashMap hMap = new HashMap<>(); //试图将两个key为null值的key—value对放入HashMap中 hMap.put(null, null); hMap.put(null, null); //将一个value为null值的key—value对放入HashMap中 hMap.put("a", null); System.out.println(hMap); } }
运行结果:
{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相等的标准。
import java.util.Hashtable; class A { int count; public A(int count) { this.count = count; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj.getClass() == A.class) { A a = (A) obj; return this.count == a.count; } return false; } @Override public int hashCode() { return this.count; } } class B { @Override public boolean equals(Object obj) { return true; } } public class HashtableTest { public static void main(String[] args) { Hashtable ht = new Hashtable<>(); ht.put(new A(60), "黑马程序员"); ht.put(new A(52), "传智播客"); ht.put(new A(78), "CSDN"); ht.put(new A(60), new B()); System.out.println(ht); /*只要两个对象通过equals()方法比较返回true,Hashtable就认为 * 它们是相等的value,由于Hashtable中有一个B对象,它与任何 * 对象通过equals()方法比较都相等,所以下面输出true*/ System.out.println(ht.containsValue("测试字符串")); /*只要两个A对象的count对象相等,它们通过equals()方法比较返回 * true,且hashCode值相等,Hashtable即认为它们是相等的key, * 所以输出true*/ System.out.println(ht.containsKey(new A(52))); //删除最后一个key—value对 ht.remove(new A(78)); //通过返回Hashtable返回的所有key组成的Set集合 //从而遍历Hashtable的每个key—value对 for (Object key : ht.keySet()) { System.out.println(key + "---->"); System.out.println(ht.get(key) + "\n"); } } }
运行结果:
{A@34=传智播客, A@3c=B@592fa617, A@4e=CSDN} true true A@34----> 传智播客 A@3c----> B@592fa617
上面程序定义了A类和B类,其中A类判断两个A对象相等的标准是count实例变量:只要两个A对
象的count变量相等,则通过equals()方法比较它们返回true,它们的hashCode值也相等;而B对象
则可以与任何对象相等。
与HashSet类似,如果使用可变对象作为HashMap、Hashtable的key,并且程序修改了作为key
的可变对象,则也可能出现于HashSet类似的情况:程序再也无法准确访问到Map中被修改过的key。
以下程序示范了上述情况。
import java.util.Hashtable; import java.util.Iterator; class A { int count; public A(int count) { this.count = count; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj.getClass() == A.class) { A a = (A) obj; return this.count == a.count; } return false; } @Override public int hashCode() { return this.count; } } public class HashtableErrorTest { public static void main(String[] args) { Hashtable htHashtable = new Hashtable<>(); htHashtable.put(new A(60), "黑马程序员"); htHashtable.put(new A(52), "传智播客"); //获取Hashtable的key Set集合对应的Iterator迭代器 Iterator iterator = htHashtable.keySet().iterator(); System.out.println(htHashtable); //取出Map中第一个key A first = (A) iterator.next(); first.count = 60; System.out.println(htHashtable); //只能删除没有修改过的key所对应的key—value对 htHashtable.remove(new A(60)); System.out.println(htHashtable); System.out.println(htHashtable.get(new A(60))); System.out.println(htHashtable.get(new A(52))); } }
运行结果:
{A@34=传智播客, A@3c=黑马程序员} {A@3c=传智播客, A@3c=黑马程序员} {A@3c=传智播客} null null
相关文章推荐
- Spring Bean范围 示例
- springmvc 多数据源配置
- Java内存溢出详解
- Eclipse中maven环境搭配,使用jetty启动后不能更改css,js文件的解决方法
- scheduleAtFixedRate定时任务超时问题
- Java加密技术(三)—— HMACSHA1 加密算法
- 2015第24周四Spring事务4
- Java 读取xml文件
- 使用spring @Scheduled注解执行定时任务
- 深入理解Java的接口和抽象类
- java代码实现随机中奖 的代码
- 使用Maven运行Java main的3种方式
- 学生成绩管理系统2(java类的运用,面向对象思想的应用)
- 学生成绩管理系统2(java类的运用,面向对象思想的应用)
- Java设计模式 单例模式(Singleton)
- Loadrunner java vuser多台机器运行报错 Error: Compilation process failed解决方法
- java 读取配置文件
- Java中HashMap,LinkedHashMap,TreeMap的区别
- java中的File创建文件
- spring注解实例1