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

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

HashMap:

特点:

允许插入null键 null值

线程不安全,效率高

注意事项:

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

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

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

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

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

package about_hashtable;

import java.util.HashMap;

public class Test {

	public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(new String("古巨基"),"s001");
hashMap.put(new String("张根硕"), "s002");
hashMap.put(new String("吴孟达"), null);
hashMap.put(null, null); System.out.println(hashMap.values());
} }

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



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

键和值都可以是null。


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

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

package about_hashtable;

public class People{
private String name;
private int age; public People() {
} public People(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} }

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

package about_hashtable;

import java.util.HashMap;

public class Test {

	public static void main(String[] args) {
HashMap<People, String> hashMap = new HashMap<>();
hashMap.put(new People("古巨基", 23),"s001");
hashMap.put(new People("张根硕", 26), "s002");
hashMap.put(new People("古巨基", 23), "s003");
hashMap.put(new People("张根硕", 26), "s004"); System.out.println(hashMap.values());
} }

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

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

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

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

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

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

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


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

package about_hashtable;

public class People{
private String name;
private int age; public People() {
} public People(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} }

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



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


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

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

package about_hashtable;

import java.util.HashMap;

public class Test {

	public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(new String("古巨基"),"s001");
hashMap.put(new String("张根硕"), "s002");
hashMap.put(new String("古巨基"), "s003");
hashMap.put(new String("张根硕"), "s004"); System.out.println(hashMap.values());
} }

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



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

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


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

HashMap的遍历:

  • 法1:

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

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

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

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

package about_hashtable;

import java.util.HashMap;
import java.util.Map;
import java.util.Set; public class Test { public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>(); map.put("唔系", "渣渣辉");
map.put("贪玩蓝月", "一款里从喂顽固的游戏");
map.put("开局", "只需三分钟");
map.put("不发一分钱", "装备全靠捡"); Set<String> keySet = map.keySet();
System.out.println(keySet); for (String key : keySet) {
System.out.println("----------------------");
System.out.println(key);
System.out.println(map.get(key));
}
} }

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

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

package about_hashtable;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class Test { public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>(); map.put("唔系", "渣渣辉");
map.put("贪玩蓝月", "一款里从喂顽固的游戏");
map.put("开局", "只需三分钟");
map.put("不发一分钱", "装备全靠捡"); Set<Entry<String, String>> entries = map.entrySet();
System.out.println(entries); for (Entry<String, String> entry : entries) {
System.out.println("----------------------");
System.out.println(entry);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
} }

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


那么,有关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. xgboost安装与原理

    1.xgboost库的安装 先在网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 中下载whl文件,注意一定要下载跟自己当前安装Python版 ...

  2. Building Applications with Force.com and VisualForce(Dev401)(十):Designing Applications for Multiple Users: Building Business Processes that You Want

    Dev401-011: Building Business Processes that You Want Course Objectives1.Describe the capabilities o ...

  3. Colab笔记本能用英伟达Tesla T4了,谷歌的羊毛薅到酸爽

    谷歌出品的Colab笔记本,机器学习界薅羊毛神器,如今又有了新福利: 连英伟达最新一代机器学习GPU:Tesla T4都能免费蹭,穷苦羊毛党也顿时高端了起来. 英伟达的Tesla T4,是去年秋天才发 ...

  4. 8 个出没在 Linux 终端的诡异家伙

    这篇文章,我们一起来到 Linux 的诡异的一面-- 你知道吗?在我们日常使用的 Unix(和 Linux )及其各种各样的分支系统中,存在着一些诡异的命令或进程,它们让人毛骨悚然,有些确实是有害,但 ...

  5. Unable to locate JAR/zip in file system as specified by the driver definitio

    把之前的驱动包删掉,然后把你的驱动包导入就行了 现在OK键就算正常了

  6. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

    前言 回顾之前的两篇Swagger做Api接口文档,我们大体上学会了如何在net core3.1的项目基础上,搭建一套自动生产API接口说明文档的框架. 本来在Swagger的基础上,前后端开发人员在 ...

  7. NKOJ4330 逛公园

    时间限制 : - MS   空间限制 : 565536 KB  评测说明 : 3s 问题描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入 ...

  8. 【Net】ABP框架学习之它并不那么好用

    前言 上一篇文章介绍了ABP的Web API,本文在继续介绍ABP的其他内容. 在ABP中,WEBAPI是一个值得用的东西.但其他东西,就不一定是那么好用了. 下面我们看一下ABP的Controlle ...

  9. 在docker中部署redis主从配置

    环境说明: 阿里云服务器 Ubuntu 16.04 docker 1.拉取Redis镜像 docker pull redis 2.配置Redis启动配置文件,此处我创建一个专用目录,存放Redis相关 ...

  10. Spring IOC/ AOP 笔记

    扫描 Bean 以下主要是使用基于注解方式配置 组件扫描(一般用于自己写的类) 添加 @Component 注解,被扫描到后自动作为 Bean 组件 @ComponentScan 扫描配置的位置,将添 ...