------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. 【原】K3Cloud平台开发之Python插件

    有时候我们的表单可能很简单,只是一个简单交互的表单,但有可能还是要劳师动众的给它建个工程写个插件,是不是很不爽?例如我有如下一个表单: 功能很简单就是选个业务对象,收集绑定几个字段名,然后确定返回一个 ...

  2. iOS版 hello,world版本2

    // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lishujun. All rig ...

  3. Hbase Java API程序设计步骤

    http://www.it165.net/admin/html/201407/3390.html 步骤1:创建一个Configuration对象 包含了客户端链接Hbase服务所需的全部信息: zoo ...

  4. In machine learning, is more data always better than better algorithms?

    In machine learning, is more data always better than better algorithms? No. There are times when mor ...

  5. iOS9 App Thinning(应用瘦身)功能介绍

    iOS9 发布后,产生了一个使 App Thinning 无法正常运行的 bug.在iOS9.0.2 版本中,这个 bug 已经被修复,App Thinning 已经可以正常使用.当你从应用商店(Ap ...

  6. Keil C中全局变量的使用

    在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...

  7. JS获取TextArea和Input的同步值

    在提交表单时,如果只是表单值,用一个form即可,但有时候需要将整个表单一起提交,则可通过以下js实现. <!DOCTYPE html> <html xmlns="http ...

  8. xml中1字节的UTF-8序列的字节1无效([字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案)

    今天在eclipse中编写pom.xml文件时,注释中的中文被eclipse识别到错误:Invalid byte 1 of 1-byte UTF-8 sequence,曾多次遇到该问题,问题的根源是: ...

  9. 获取css的属性值

    # -*- coding:utf-8 -*- """ 在元素上执行双击操作 """ from selenium import webdriv ...

  10. 【转】VSync Count 垂直同步

    原文:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直 ...