本篇博文的知识点,在我们的日常生活中,应用十分广阔。比如:每个学生,都有自己的对应的学号、每一个公民,都有自己的身份证号… … 相信看到这里,有的同学基本上已经猜到了这个类的主要用途。那么,话不多说,我们开始主题的讲解吧!

(有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》

HashMap:

特点

允许插入null键 null值

线程不安全,效率高

注意事项

注意 键 的类型是否重写了equals()方法

(是否录入是靠 已存在HashMap集合中的键值对的 键要录入的键值对的 键equals()的返回值

  • 返回true,则 用新键值对覆盖旧键值对
  • 返回false,则 直接录入新键值对)

HashMap在Map集合中,基于Map接口,并没有专属常用API,所以,本人在这里就直接来展示下对这个类的使用:

首先,本人来给出一个例子:

  1. package about_hashtable;
  2. import java.util.HashMap;
  3. public class Test {
  4. public static void main(String[] args) {
  5. HashMap<String, String> hashMap = new HashMap<>();
  6. hashMap.put(new String("古巨基"),"s001");
  7. hashMap.put(new String("张根硕"), "s002");
  8. hashMap.put(new String("吴孟达"), null);
  9. hashMap.put(null, null);
  10. System.out.println(hashMap.values());
  11. }
  12. }

现在让我们来看一下运行结果:



可以看到,我们用HashMap存储的键值对:

键和值都可以是null


本人再来给出一个奇怪的例子

首先本人给出一个存储“键”信息的People类:

  1. package about_hashtable;
  2. public class People{
  3. private String name;
  4. private int age;
  5. public People() {
  6. }
  7. public People(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Student{" +
  26. "name='" + name + '\'' +
  27. ", age=" + age +
  28. '}';
  29. }
  30. }

现在,本人再来给出一个测试类:

  1. package about_hashtable;
  2. import java.util.HashMap;
  3. public class Test {
  4. public static void main(String[] args) {
  5. HashMap<People, String> hashMap = new HashMap<>();
  6. hashMap.put(new People("古巨基", 23),"s001");
  7. hashMap.put(new People("张根硕", 26), "s002");
  8. hashMap.put(new People("古巨基", 23), "s003");
  9. hashMap.put(new People("张根硕", 26), "s004");
  10. System.out.println(hashMap.values());
  11. }
  12. }

那么,让我们来看一下运行结果:

这时候可能有同学会产生疑问:

在《详解 Map集合》的讲解中,说到:

若录入 “键相同” 的键值对,则会 覆盖旧的键值对

那么,为什么还是录入了四个信息呢?

答曰:每个录入的信息是通过new出来的,它们的地址值是不同的。

而我们若是想根据“键的内容”去存储,而不是根据“键的地址”去存储的话,就要重写键的类的equals()方法


现在,本人来重写下People类的equals()方法:

  1. package about_hashtable;
  2. public class People{
  3. private String name;
  4. private int age;
  5. public People() {
  6. }
  7. public People(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. @Override
  24. public int hashCode() {
  25. final int prime = 31;
  26. int result = 1;
  27. result = prime * result + age;
  28. result = prime * result + ((name == null) ? 0 : name.hashCode());
  29. return result;
  30. }
  31. @Override
  32. public boolean equals(Object obj) {
  33. if (this == obj)
  34. return true;
  35. if (obj == null)
  36. return false;
  37. if (getClass() != obj.getClass())
  38. return false;
  39. People other = (People) obj;
  40. if (age != other.age)
  41. return false;
  42. if (name == null) {
  43. if (other.name != null)
  44. return false;
  45. } else if (!name.equals(other.name))
  46. return false;
  47. return true;
  48. }
  49. @Override
  50. public String toString() {
  51. return "Student{" +
  52. "name='" + name + '\'' +
  53. ", age=" + age +
  54. '}';
  55. }
  56. }

那么,现在我们再来看一下运行结果:



可以看到,在我们重写了“键”所属的类的equals()方法后,当我们再次向HashMap中存放数据时,就会按照“键的equals()的返回值”来决定存放不存放了。


那么,相对地,本人再来提出一个奇怪的例子:

现在本人来对测试类做些修改:

  1. package about_hashtable;
  2. import java.util.HashMap;
  3. public class Test {
  4. public static void main(String[] args) {
  5. HashMap<String, String> hashMap = new HashMap<>();
  6. hashMap.put(new String("古巨基"),"s001");
  7. hashMap.put(new String("张根硕"), "s002");
  8. hashMap.put(new String("古巨基"), "s003");
  9. hashMap.put(new String("张根硕"), "s004");
  10. System.out.println(hashMap.values());
  11. }
  12. }

那么,现在我们来看一下运行结果:



可以看到,我们并没有重写String的equals()方法,但是却按照每个键的内容是否相同决定存储了。

相信看过前几篇博文的同学现在已经知道了答案——String类内部已经重写了equals()方法。


那么,在最后,本人再来讲解一个知识点 —— HashMap的遍历:

HashMap的遍历

  • 法1:

    通过keySet()方法获取键集,通过遍历键集来遍历值集
  • 法2:

    通过entrySet()方法获得Entry类型的Set集,通过遍历这个集,同时调用getKey() 和 getValue()方法,就能获取原HashMap的所有存储信息了

那么,现在本人来展示下这两种遍历方法的应用:

法1(通过keySet()方法):

  1. package about_hashtable;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. public class Test {
  6. public static void main(String[] args) {
  7. Map<String, String> map = new HashMap<String, String>();
  8. map.put("唔系", "渣渣辉");
  9. map.put("贪玩蓝月", "一款里从喂顽固的游戏");
  10. map.put("开局", "只需三分钟");
  11. map.put("不发一分钱", "装备全靠捡");
  12. Set<String> keySet = map.keySet();
  13. System.out.println(keySet);
  14. for (String key : keySet) {
  15. System.out.println("----------------------");
  16. System.out.println(key);
  17. System.out.println(map.get(key));
  18. }
  19. }
  20. }

那么,本人在来展示下运行结果:

法2(通过entrySet()方法):

  1. package about_hashtable;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. import java.util.Set;
  6. public class Test {
  7. public static void main(String[] args) {
  8. Map<String, String> map = new HashMap<String, String>();
  9. map.put("唔系", "渣渣辉");
  10. map.put("贪玩蓝月", "一款里从喂顽固的游戏");
  11. map.put("开局", "只需三分钟");
  12. map.put("不发一分钱", "装备全靠捡");
  13. Set<Entry<String, String>> entries = map.entrySet();
  14. System.out.println(entries);
  15. for (Entry<String, String> entry : entries) {
  16. System.out.println("----------------------");
  17. System.out.println(entry);
  18. System.out.println(entry.getKey());
  19. System.out.println(entry.getValue());
  20. }
  21. }
  22. }

那么,本人在来展示下运行结果:


那么,有关HashMap的基本知识点也就这些了。

(有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》

(本人 集合框架 的总集篇博文链接:https://www.cnblogs.com/codderYouzg/p/12416560.html

详解 HashMap的更多相关文章

  1. 详解HashMap源码解析(下)

    上文详解HashMap源码解析(上)介绍了HashMap整体介绍了一下数据结构,主要属性字段,获取数组的索引下标,以及几个构造方法.本文重点讲解元素的添加.查找.扩容等主要方法. 添加元素 put(K ...

  2. 详解HashMap的内部工作原理

    本文将用一个简单的例子来解释下HashMap内部的工作原理.首先我们从一个例子开始,而不仅仅是从理论上,这样,有助于更好地理解,然后,我们来看下get和put到底是怎样工作的. 我们来看个非常简单的例 ...

  3. 详解HashMap数据结构实现

    HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...

  4. 详解HashMap源码解析(上)

    jdk版本:1.8 数据结构: HashMap的底层主要基于数组+链表/红黑树实现,数组优点就是查询块,HashMap通过计算hash码获取到数组的下标来查询数据.同样也可以通过hash码得到数组下标 ...

  5. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  6. 详解 Map集合

    (请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Map集合 的特点: Map集合 的特点: 特点: 通过 键 映射到 值的对象 一个 映射 ...

  7. 详解ConCurrentHashMap源码(jdk1.8)

    ConCurrentHashMap是一个支持高并发集合,常用的集合之一,在jdk1.8中ConCurrentHashMap的结构和操作和HashMap都很类似: 数据结构基于数组+链表/红黑树. ge ...

  8. HashMap实现原理分析(详解)

    1. HashMap的数据结构 http://blog.csdn.net/gaopu12345/article/details/50831631   ??看一下 数据结构中有数组和链表来实现对数据的存 ...

  9. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

随机推荐

  1. Building Applications with Force.com and VisualForce(Dev401)(十四):Implementing Business Processes:Auditing Processes

    Dev401-015:Implementing Business Processes:Auditing Processes Module Objectives1.list some of the fe ...

  2. OpenCV-Python 用于角点检测的FAST算法 | 四十一

    目标 在本章中, 我们将了解FAST算法的基础知识. 我们将使用OpenCV功能对FAST算法进行探索. 理论 我们看到了几个特征检测器,其中很多真的很棒.但是,从实时应用程序的角度来看,它们不够快. ...

  3. OpenCV-Python 直方图-2:直方图均衡 | 二十七

    目标 在本节中, 我们将学习直方图均衡化的概念,并利用它来提高图像的对比度. 理论 考虑这样一个图像,它的像素值仅局限于某个特定的值范围.例如,较亮的图像将把所有像素限制在高值上.但是一幅好的图像会有 ...

  4. 深度学习、物联网专家Sunil Kumar Vuppala博士独家专访

    介绍 有多种方法可以学习数据科学,机器学习和深度学习概念.您可以观看视频,阅读文章,参加课程,参加会议等.但是有一件事是无法替代的----经验. 我个人从与数据科学专家和行业领袖的交流中学到了很多.他 ...

  5. 一文看懂神经网络初始化!吴恩达Deeplearning.ai最新干货

    [导读]神经网络的初始化是训练流程的重要基础环节,会对模型的性能.收敛性.收敛速度等产生重要的影响.本文是deeplearning.ai的一篇技术博客,文章指出,对初始化值的大小选取不当,  可能造成 ...

  6. HDU - 2444 二分图最大匹配 之 判断二分图+匈牙利算法

    题意:第一行给出数字n个学生,m条关系,关系表示a与b认识,判断给定数据是否可以构成二分图,如果可以,要两个互相认识的人住一个房间,问最大匹配数(也就是房间需要的最小数量) 思路:要看是否可以构成二分 ...

  7. WePY框架 input,checkbox-group,radio-group等change 一般处理方法

    布局搞定了,接下来就是数据处理方面了 form表单中常用标签,绑定change方法: 方法的具体实现 根据打印出来e的结果可以看到,e指代当前标签对象,包含属性方法等 从detail中可以获取多选框选 ...

  8. Python python 函数参数:必选参数,默认参数

    import math # 函数的必选参数 '''函数的必选参数,指的是函数调用的时候必须传入的参数 ''' def cal (n): return n * n var = cal(2) '''上面的 ...

  9. openssl与java(读取加密码的密钥)

    最近在研究java security方面的东西,java自带可以使用各种加密解密算法(rsa,dsa,des3,aes,md5...),但往往一些密钥是第三方给我们的,我们需要用java装载这些密钥然 ...

  10. mac主机无法访问虚拟机中的Ubuntu运行的web服务

    第一点: 检查主机和虚拟机之间是否连通: 在mac主机中ping 虚拟机ip 虚拟机ip可以在虚拟机命令行中输入 ifconfig查看 第二点: 如果不能ping通,改变虚拟机的网络连接方式为:桥接模 ...