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

最新文章

  1. mysql中文乱码解决方法
  2. 通过mdf ldf文件还原数据库
  3. firefox阅读模式
  4. Freemarker-数字默认格式化问题
  5. Shell expr的用法 bc 命令 let命令
  6. awk文本处理知识汇总
  7. 【hadoop2.6.0】用C++ 编写mapreduce
  8. SpriteBuilder中CCMotionStreak提示图片文件找不到
  9. JavaScript基本概念
  10. MySQL表行数查询最佳实践
  11. Nginx详解十九:Nginx深度学习篇之进阶高级模块
  12. MYSQL 总结——1
  13. 使用kolla安装的openstack mariadb为集群所有节点无法启动
  14. leetcode - [1]Reverse Words in a String
  15. 在Docker环境下部署高可用的Eureka注册中心
  16. ubuntu16.04下无线网卡无法正常连网
  17. jenkins webhook 配置
  18. 数据库-mysql数据连接
  19. 计算Python代码运行时间长度方法
  20. Delphi 中调用JS文件中的方法

热门文章

  1. 002_Visual Studio (gnuplot)显示数组波形
  2. scylladb docker-compose 用户密码认证配置
  3. 转载:SVD
  4. Eclipse R语言开发环境搭建 StatET插件
  5. Java-内存模型 synchronized 的内存语义
  6. VS2013下开发VC++程序,编译时提示错误error MSB8020: The build tools for v140 (Platform Toolset = &#39;v140&#39;) 的解决方案
  7. 026_如何在MAC下输入主要国家货币符号?
  8. @MatrixVariable的使用
  9. 调用百度API接口 正解析地址和逆解析
  10. 【LeetCode算法-28/35】Implement strStr()/Search Insert Position