[TOC]
## **1 什么是Java HashMap**
Java HashMap类通过使用哈希表来实现Map接口。HashMap继承了AbstractMap类并实现Map接口。
Java HashMap要记住的核心要点:
* Java HashMap类包含key-value对。
* Java HashMap类不能存储重复数据(key不能重复)。
* Java HashMap类可以包含一个或多个null值。
* Java HashMap类是非同步的(线程不安全)。
* Java HashMap类元素是无序的。
* Java HashMap类的初始默认容量为16,负载因子为0.75。
<br>
<br>
## **2 Java HashMap的层次结构**
:-: ![](https://img.kancloud.cn/c3/54/c354688547120628c7e9066e7c7126cd_171x443.png)
如上图所示,HashMap类继承了AbstractMap类并实现了Map接口。
:-: ![](https://img.kancloud.cn/17/9d/179d1a97a9e8fedf7e9f6aeda2646387_1384x482.png)
<br>
<br>
## **3 Java HashMap的语法**
~~~java
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
~~~
基本类型对应的包装类表如下:
| 基本类型 | 引用类型 |
| --- | --- |
| boolean | Boolean |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:
~~~
import java.util.HashMap; // 引入 HashMap 类
~~~
<br>
<br>
## **4 Java HashMap的构造方法**
| 构造方法 | 描述 |
| --- | --- |
| HashMap() | 用于构造默认的HashMap。 |
| HashMap(Map m) | 用于通过使用给定Map对象的元素来初始化HashMap。 |
| HashMap(int capacity) | 用于将HashMap的容量初始化为给定的整数值。 |
| HashMap(int capacity, float loadFactor) | 用于通过使用其参数来初始化HashMap的容量和负载因子。 |
<br>
<br>
## **5 Java HashMap的方法**
| 方法 | 描述 |
| --- | --- |
| [void clear()]() | 用于删除Map中的所有数据。 |
| [boolean isEmpty()]() | 如果Map不包含元素,则用于返回true。 |
| [Object clone()]() | 用于返回此HashMap实例的浅表副本:键和值本身不会被克隆。 |
| [Set entrySet()]() | 用于返回Map中包含的Entry的Set集合。 |
| [Set keySet()]() | 用于返回Map中所有key的Set视图。 |
| [V put]() | 用于在Map中插入一个条目。 |
| [void putAll(Map map)]() | 用于在Map中插入指定的Map。 |
| [V putIfAbsent(K key, V value)]() | 仅当尚未将指定值和指定键插入Map时,才将其插入。 |
| [V remove(Object key)]() | 用于删除指定key的条目。 |
| [boolean remove(Object key, Object value)]() | 从Map中删除具有关联的指定键的指定值。 |
| [V compute(K key, BiFunction remappingFunction)]() | 用于计算指定键及其当前映射值的Map(如果没有当前映射,则为null)。 |
| [V computeIfAbsent(K key, Function mappingFunction)]() | 如果指定的键尚未与值关联(或已映射为null),则使用给定的映射函数计算它的值,除非为null,否则将其输入到此Map中。 |
| [V computeIfPresent(K key, BiFunction remappingFunction)]() | 如果指定键的值存在且非空,则用于给定键及其当前映射值的情况下计算新映射。 |
| [boolean containsValue(Object value)]() | 如果Map中存在等于该值的某个值,则此方法返回true,否则返回false。 |
| [boolean containsKey(Object key)]() | 如果Map中存在等于该键的某个键,则此方法返回true,否则返回false。 |
| [boolean equals(Object o)]() | 用于将指定的Object与Map进行比较。 |
| [void forEach(BiConsumer action)]() | 对Map中的每个条目执行给定的操作,直到所有条目都已处理或该操作引发异常为止。 |
| [V get(Object key)]() | 返回根据key获取的value对象。 |
| [V getOrDefault(Object key, V defaultValue)]() | 返回根据key获取的value对象,如果Map不包含该key的值,则返回默认值defaultValue。 |
| [V merge(K key, V value, BiFunction remappingFunction)]() | 如果指定的键尚未与值关联或与null关联,请将其与给定的非null值关联。 |
| [V replace(K key, V value)]() | 将指定的值替换为指定的键。 |
| [boolean replace(K key, V oldValue, V newValue)]() | 用指定键的新值替换旧值。 |
| [void replaceAll(BiFunction function)]() | 用在该条目上调用给定函数的结果替换每个条目的值,直到处理完所有条目或该函数引发异常为止。 |
| [Collection values()]() | 返回Map中所有value的Set集合。 |
| [int size()]() | 返回Map的元素个数。 |
以下实例我们创建一个 HashMap 对象 map, 整型(Integer)的 key 和字符串(String)类型的 value:
<br>
<br>
## **6 Java HashMap例子:add()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> hm=new HashMap<Integer,String>();
System.out.println("初始化HashMap: "+hm);
hm.put(100,"Eric");
hm.put(101,"Jack");
hm.put(102,"Rose");
System.out.println("执行put()方法后 ");
for(Map.Entry m:hm.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
hm.putIfAbsent(103, "Lucy");
System.out.println("执行putIfAbsent()方法后 ");
for(Map.Entry m:hm.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(104,"Macy");
map.putAll(hm);
System.out.println("执行putAll()方法后 ");
for(Map.Entry m:map.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
~~~
**运行结果:**
初始化HashMap: {}
执行put()方法后
100 Eric
101 Jack
102 Rose
执行putIfAbsent()方法后
100 Eric
101 Jack
102 Rose
103 Lucy
执行putAll()方法后
100 Eric
101 Jack
102 Rose
103 Lucy
104 Macy
<br>
<br>
## **7 Java HashMap例子:remove()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Paul");
map.put(103, "Rose");
System.out.println("初始化HashMap: "+map);
//删除元素
map.remove(100);
System.out.println("更新后: "+map);
//删除元素
map.remove(101);
System.out.println("更新后: "+map);
//删除元素
map.remove(102, "Paul");
System.out.println("更新后: "+map);
}
}
~~~
**运行结果:**
初始化HashMap: {100=Eric, 101=Jack, 102=Paul, 103=Rose}
更新后: {101=Jack, 102=Paul, 103=Rose}
更新后: {102=Paul, 103=Rose}
更新后: {103=Rose}
<br>
<br>
## **8 Java HashMap例子:replace()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> hm=new HashMap<Integer,String>();
hm.put(100,"Eric");
hm.put(101,"Jack");
hm.put(102,"Rose");
System.out.println("初始化HashMap:");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replace(102, "Rose");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replace(101, "Jack", "Mark");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replaceAll((k,v) -> "Lucy");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
~~~
**运行结果:**
初始化HashMap:
100 Eric
101 Jack
102 Rose
更新后:
100 Eric
101 Jack
102 Rose
更新后:
100 Eric
101 Mark
102 Rose
更新后:
100 Lucy
101 Lucy
102 Lucy
## **9 HashSet和HashMap的区别**
HashSet仅仅包含value值,而HashMap是key-value对象(键和值对)
- Java自动化测试
- 第一章:Java:基础内容
- 1.1:Java:Hello Word
- 1.2:Java:热身
- 1.3:Java:注释
- 1.4:Java:标识符
- 1.5:Java:常量
- 1.6:Java:基本数据类型
- 1.7:Java:引用类型
- 1.8:Java:String类
- 第二章:Java:运算符
- 2.1:Java:算数运算符
- 2.2:Java:关系运算符
- 2.3:Java:逻辑运算
- 2.4:Java:赋值运算符
- 2.5;Java:三元运算符
- 2.6:Java:位运算符
- 第三章:Java:循环控制语句
- 3.1:Java:for循环
- 3.2:Java:while循环
- 3.3:Java:switch
- 3.4:Java:if else
- 3.5:Java:练习题
- 第四章:Java:函数与全局/局部变量
- 4.1:Java:局部变量
- 4.2:Java:全局变量
- 第五章:Java:方法
- 5.1:Java:初识方法
- 5.2:Java:方法调用
- 5.3:Java:方法重载
- 5.4:Java:构造方法
- 5.5:Java:方法的注意事项
- 第六章:Java:面向对象
- 6.1:Java:小案例
- 6.2:Java:this 关键字
- 6.3:Java:super 关键字
- 6.4:Java:static 关键字
- 6.5:Java:final关键字
- 6.6:Java:instanceof 运算符
- 6.7:Java:面向对象之封装
- 6.8:Java:面向对象之继承
- 6.9:Java:面向对象之多态
- 第七章:Java:面向对象高级进阶
- 7.1:Java:抽象类
- 7.2:Java:Java中String类
- 7.3:Java:interface接口
- 7.4:Java:ArrayList
- 7.5:Java:HashSet
- 7.6:Java:HashMap
- 7.7:Java:反射(reflection)
- 第八章:Java:日志以及异常捕获
- 8.1:Java:log4j
- 8.2:Java:异常初识基础
- 8.3:Java:未被捕获的异常
- 8.4:Java:try和catch的使用
- 8.5:Java:多重catch语句的使用
- 8.6:Java:throws/throw 关键字
- 8.7:Java:finally关键字
- 8.8:Java:自定义异常
- 第九章:Java:xml and IO
- 9.1:Java:IO基本概念
- 9.2:java:properties
- 9.3:Java:xml基本介绍
- 9.4:Java:xml操作实例
- 第十章:Java:JDBC编程
- 10.1:Java:JDBC介绍
- 10.2:Java:JDBC查询
- 10.3:Java:JDBC插入
- 10.4:Java:Batch
- 10.5:Java:JDBC连接池
- 第十一章:Java:TestNG
- 11.1:java:TestNG简介
- 11.2:Java:TestNG小实例
- 11.3:Java:TestNG.xml文件配置
- 11.4:Java:TestNG基本注解
- 11.5:Java:TestNG注解代码
- 11.6:Java:TestNG预期异常
- 11.7:Java:TestNG忽略测试
- 11.8:Java:TestNG超时测试
- 11.9:Java:TestNG分组测试