HashMap的概念

HashMap底层实现了哈希表,这是一种非常重要的数据结构,对于以后我们理解很多技术都有帮助,例如 redis数据库的核心技术和HashMap一样,因此,非常有必要让大家理解。

HashMap的数据结构由数组和链表来实现对数据的存储,它们各有特点:

  1. 数组:占用空间连续,寻址容易,查询速度快。但是增删效率低。
  2. 链表:占用空间不连续,寻址困难,查询速度慢。但是增删效率高。

将数据与链表的优点结合起来,就得到了我们的哈希表。因此哈希表的本质就是数组+链表。

HashMap的常用方法

关键点摘要:

  • 泛型可以使用基本数据类型,也可以使用引用数据类型
  • 使用put填入同一个key,后面的key对应的值会替换前面的key对应的值
  • 替换replace与remove方法都有两种形式,返回被删除/替换的值和返回boolean。
package _20191211;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; /**
* HashMap部分方法测试
* @author TEDU
*
*/
public class HashMapTest {
public static void main(String[] args) {
Map<Integer,String> myMap = new HashMap<>();
myMap.put(1,"one");
myMap.put(2,"two");
myMap.put(3,"three");
System.out.println(myMap.get(1));//返回key对应的值
System.out.println(myMap.containsKey(3));//是否包含指定的key
System.out.println(myMap.containsValue("One"));//是否包含指定的值
//移除方法
System.out.println(myMap.remove(2));//移除指定的key,返回其值
System.out.println(myMap);
System.out.println(myMap.remove(1,"one"));//移除指定的key与value,返回boolean
System.out.println(myMap);
//key不能重复,若重复,会将该key对应的value覆盖,不可以将此方法做替换方法用,不便于阅读
myMap.put(3,"三");
System.out.println(myMap);
//替换方法 replace 只能替换已存在的键值对
System.out.println(myMap.replace(3,"three"));//返回被替换的值
System.out.println(myMap.replace(1,"one"));//只能替换已存在的
System.out.println(myMap.replace(3, "three", "叁"));//返回布尔值
System.out.println(myMap);
//putAll 将一个map添加到另一个map
Map<Integer,String> myMap2 = new HashMap<>();
myMap2.put(4, "肆");
myMap.putAll(myMap2);
System.out.println(myMap);
//返回key的set集合
Set<Integer> keySet = myMap.keySet();
System.out.println(keySet);
//返回value的集合
Collection values = myMap.values();
System.out.println(values); }
}

  

一个例子:

使用HashMap存储一个公司的员工信息。(泛型可以使用基本数据类型,也可以使用引用数据类型)

package _20191211;

import java.util.HashMap;
import java.util.Map; public class HashMapTest02 {
public static void main(String[] args) {
Employee ep1 = new Employee("小白",20000);
Employee ep2 = new Employee("小黑",10000);
Map<Integer,Employee> mp = new HashMap<>();
mp.put(1001,ep1);
mp.put(1002,ep2);
System.out.println(mp); }
} class Employee{
private String name;
private int salary;
public Employee(String name, int salary) {
super();
this.name = name;
this.salary = salary;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return " 姓名:"+name+" 薪水:"+salary;
}
}

  

HashMap与HashTable的区别

HashMap:线程不安全,效率高,允许key与value为null

HashTable:线程安全,效率低,不允许key与value为null

47 容器(六)——HashMap的更多相关文章

  1. 给jdk写注释系列之jdk1.6容器(4)-HashMap源码解析

    前面了解了jdk容器中的两种List,回忆一下怎么从list中取值(也就是做查询),是通过index索引位置对不对,由于存入list的元素时安装插入顺序存储的,所以index索引也就是插入的次序. M ...

  2. 六.HashMap HashTable HashSet区别剖析总结

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面: 1.HashSet底层采用 ...

  3. Java容器:HashMap和HashSet解析

    转载请注明出处:jiq•钦's technical Blog 一.HashMap HashMap,基于散列(哈希表)存储"Key-Value"对象引用的数据结构. 存入的键必须具备 ...

  4. Java容器:HashMap连环炮

    本文来源于:https://mp.weixin.qq.com/s/oRx-8XXbgage9Hf97WrDQQ, 公众号:安琪拉的博客 前言 HashMap应该算是Java后端工程师面试的必问题,因为 ...

  5. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  6. Map,HashMap

    Map(映射),又称为字典(Dictionary),是由关键字(Key)及其对应的元素值(Value)所组成的元素单元(Element)的表单式集合. 通常,对于Map而言,使用给定的Key,可以迅速 ...

  7. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  8. 基于jdk1.8的HashMap源码学习笔记

    作为一种最为常用的容器,同时也是效率比较高的容器,HashMap当之无愧.所以自己这次jdk源码学习,就从HashMap开始吧,当然水平有限,有不正确的地方,欢迎指正,促进共同学习进步,就是喜欢程序员 ...

  9. Map 综述(一):彻头彻尾理解 HashMap

    转载自:https://blog.csdn.net/justloveyou_/article/details/62893086 摘要: HashMap是Map族中最为常用的一种,也是 Java Col ...

随机推荐

  1. AJax的三种响应

    AJax的响应 1.普通文本方式(字符串) resp.getWriter().print("你好"); 2.JSON格式当要给前台页面传输 集合或者对象时 使用普通文本传输的时St ...

  2. [USACO14MAR] Sabotage 二分答案 分数规划

    [USACO14MAR] Sabotage 二分答案 分数规划 最终答案的式子: \[ \frac{sum-sum[l,r]}{n-len[l,r]}\le ans \] 转换一下: \[ sum[1 ...

  3. 第09组 团队Git现场编程实战

    组长博客链接 1.团队分工 团队成员 分工明细 王耀鑫 博客撰写,数据处理 陈志荣 前端界面,前端功能实现 陈超颖 前端界面,前端功能实现 沈梓耀 前端界面,前端功能实现 林明镇 数据处理 滕佳 前端 ...

  4. 第12组 Alpha冲刺(5/6)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...

  5. OpenFOAM——具有压差的平行平板间流动(泊肃叶流动)

    本算例翻译整理自:http://the-foam-house5.webnode.es/products/chapter-1-plane-parallel-plates-case/ 这个算例中两平板间没 ...

  6. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台,更名:FXTest 接受定制开发(java版开发完毕)

    **背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够,              2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他 ...

  7. [Beta]第五次 Scrum Meeting

    [Beta]第五次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/5/13 22:00 30min 大运村公寓6F楼道 附Github仓库:WEDO 例会照片 (一人上 ...

  8. Qt中文编码和QString类Unicode编码转换

      版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/g423tgl234/article ...

  9. XmlIgnore的解释和使用

    XmlIgnore是一个自定义属性,用来指明在序列化时是否序列化一个属性.如下面的例子: public class Group { public string GroupName; [XmlIgnor ...

  10. Android A/B System OTA分析(一)概览【转】

    本文转载自:https://blog.csdn.net/guyongqiangx/article/details/71334889 Android从7.0开始引入新的OTA升级方式,A/B Syste ...