------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的情况。

 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

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

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

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

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

    Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...

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

    Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...

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

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. java源码之HashMap和HashTable的异同

    代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从 ...

  6. Java 从 Map 到 HashMap 的一步步实现

    Java 从 Map 到 HashMap 的一步步实现 一. Map 1.1 Map 接口 在 Java 中, Map 提供了键--值的映射关系.映射不能包含重复的键,并且每个键只能映射到一个值. 以 ...

  7. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

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

    在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集 ...

  9. LinkedHashSet、Map、Map接口HashMap、Hashtable,TreeSet、TreeMap、如何选择使用集合实现类,Collections工具类

    一.Set接口实现类LinkedHashSet 实现继承图: 1.LinkedHashSet的全面说明 1) LinkedHashSet是 HashSet的子类 2) LinkedHashSet底层是 ...

随机推荐

  1. 小游戏 Lights Out (关灯) 的求解 —— 异或方程组

    Author : Evensgn  Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/J ...

  2. [CF Round #294 div2] D. A and B and Interesting Substrings 【Map】

    题目链接:D. A and B and Interesting Substrings 题目大意 给定26个小写字母的权值,一共26个整数(有正有负). 给定一个小写字母组成的字符串(长度10^5),求 ...

  3. [操作系统]iOS6与iOS7屏幕适配技巧

    一.没有包装任何 导航控制器 或者 UITabBarController 1.控制器的view是UIScrollView\UITableView\UICollectionView时(控制器是UITab ...

  4. Android开源项目发现--- 工具类快速开发篇(持续更新)

    1. Guava Google的基于java1.6的类库集合的扩展项目 包括collections, caching, primitives support, concurrency librarie ...

  5. 《More Effective C++》 条款5 谨慎定义类型转换函数

    ---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换 ...

  6. bzoj1912

    由于k只有2,所以我们分类讨论显然当k=1时,我们只要连一条最长的路径即可就是树的直径L少走了L-1条边如果k=2时,我们再次连边成环后如果成环路径与上一次的最长路径没有相同的边,那少走的边数是路径长 ...

  7. WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞

    漏洞名称: WordPress A Forms插件HTML注入漏洞和跨站请求伪造漏洞 CNNVD编号: CNNVD-201308-281 发布时间: 2013-08-20 更新时间: 2013-08- ...

  8. Node.js权威指南 (2) - Node.js中的交互式运行环境——REPL

    2.1 REPL运行环境概述 / 102.2 在REPL运行环境中操作变量 / 102.3 在REPL运行环境中使用下划线字符 / 122.4 在REPL运行环境中直接运行函数 / 122.5 在RE ...

  9. 【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2

    原文网址:http://bbs.51cto.com/thread-1099956-1.html 亲爱的学员们: 如今,各路开发者为淘一桶金也纷纷转入iOS开发的行列.你心动了吗?想要行动吗?知道如何做 ...

  10. 使用LoadRunner对Web Services进行调用--Add Service Call

    利用LoadRunner对Web Services进行测试时,通常有三种可供采用的方法: 在LoadRunner的Web Services虚拟用户协议中,[Add Service Call] 在Loa ...