Java里面的Map是一个抽象接口,有一些类实现的该接口比如HashMap、TreeMap等

HashMap 是一个散列表,存储的内容是靠键值对来映射的(key-value)。

基本认识

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,

最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

构造示意图:

再HashMap中他的Key和Value类型可以相同也可以不同,可以是String的Key,Integer的Value,或者是自定义类的Key等

HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

HashMap的方法

菜鸟教程上找的的表,很好用~

方法 描述
clear() 删除 hashMap 中的所有键/值对
clone() 复制一份 hashMap
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键/值对的数量
put() 将键/值对添加到 hashMap 中
putAll() 将所有键/值对添加到 hashMap 中
putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove() 删除 hashMap 中指定键 key 的映射关系
containsKey() 检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换 hashMap 中是指定的 key 对应的 value。
replaceAll() 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach() 对 hashMap 中的每个映射执行指定的操作。
entrySet() 返回 hashMap 中所有映射项的集合集合视图。
keySet() 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
merge() 添加键值对到 hashMap 中
compute() 对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent() 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent() 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

样例代码

package HashMap;

import java.util.*;

public class Test4 {
public static void main(String[] args) {
HashMap<Integer,String> pt = new HashMap<Integer,String>();
HashMap<Phone,String> map = new HashMap<>();
pt.put(1,"卡兹克");
pt.put(2,"剑圣");
pt.put(3,"佛耶戈");
map.put(new Phone("Apple",7000),"美国");
map.put(new Phone("Sony",6000),"日本");
map.put(new Phone("Huawei",8000),"中国");
System.out.println(pt);
System.out.println(map);
for (Phone i : map.keySet()){
System.out.println(i.getBrand()+" is powered by"+map.get(i)+"cost ¥"+i.getPrice());
}
}
}
class Phone{
private String Brand;
private int Price; public Phone(String brand, int price) {
Brand = brand;
Price = price;
} public String getBrand() {
return Brand;
} public void setBrand(String brand) {
Brand = brand;
} public int getPrice() {
return Price;
} public void setPrice(int price) {
Price = price;
}
}

前面说了可以定义HashMap是基础的类型String,Integer这些,那么看看直接输出的map

可以看到直接用的基本类型定义的pt HashMap输出就是 Key=Value,

而这里自定义的Phone类型输出是,HashMap.Phone@7a79be86=中国,其实也是对应的Key和Value,

因为Phone不是基本类型 所以它输出的是@....跟的地址值或是Hash值?,如何让他输出里面我们想要的数据呢?

我们用一个迭代遍历该map,在配合Phone类里面的get方法就能获取到基本类型数据了

HashMap中的嵌套

记住这个方法 entrySet()把Map中的映射返回到集合视图

其实在遍历HashMap中的元素时候往往是把它转换成set来遍历的,这样会比我上面的直接遍历快一倍。

首先建立两个map,再创建一个map来嵌套这两个map

也就是说nested map的每个value也是一个HashMap了

然后这里用 下面的来把map转换成set,这里的nested map是用String和top定义的HashMap嵌套的

Set<Map.Entry<String, HashMap<String, String> > >

然后第一个迭代进去就是可以 i为上单 i.value 也就是top和jungle的HashMap了

想要继续遍历top,那么就需要再用一个迭代来 i.getValue().entrySet()  这个转换的集合

top定义的是两个String 这里自然也是定义成两个String的集合

然后就能取到我们想要的top里面的key和value了~~

完整代码:

package HashMap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set; public class Nested {
public static void main(String[] args) {
HashMap<String, String> jungle = new HashMap<>();
jungle.put("卡兹克","T3");
jungle.put("嘉文四世","T2"); HashMap<String, String> top = new HashMap<>();
top.put("德莱厄斯","T2");
top.put("腕豪","T1"); //用nested map来嵌套上单和打野的HashMap
HashMap<String, HashMap<String, String>> nestedmap = new HashMap<>();
nestedmap.put("打野",jungle);
nestedmap.put("上单",top); //把nested map的映射转换成集合
Set<Map.Entry<String, HashMap<String, String> > > nestedset = nestedmap.entrySet(); for (Map.Entry<String, HashMap<String, String>> i : nestedset) { System.out.println(i.getKey());
System.out.println(i.getValue()); //把map 和top的key和value转换成set,再来取嵌套对应的key 和value
Set<Map.Entry<String, String>> entries1 = i.getValue().entrySet();
for (Map.Entry<String, String> j : entries1) {
System.out.println("\t"+j.getKey()+" 现在是"+j.getValue()+"级别");
}
}
}
}

By the way

分析cc链的时候,看到这个直接懵了,所以来学习一下Map

public class InstantiateTransformer<T> implements Transformer<Class<? extends T>, T>, Serializable {
.....
}

通过学习Map,现在感觉上面这个也就是对于Transformer接口的实现类,不过这个Transformer继承T泛型有上界

? extends T 描述了通配符上界, 即具体的泛型参数需要满足条件: 泛型参数必须是 T 类型或它的子类。

感觉对于这个现在还不需要了解这么多,可以参考下这个
https://segmentfault.com/a/1190000008423240

切记 学习之路,少就是多 慢就是快!

最新文章

  1. JAVA单例的三种实现方式
  2. iOS 中的第三方库管理工具
  3. OC5_类别
  4. STM32的GPIO
  5. 【MySql】Linux下更改转移mysql数据库目录
  6. expander graph&amp;random walk的一个小应用
  7. 浏览器输入URL加载的全过程都发生了什么事情,你知道?
  8. 浅析git
  9. Cocos2D的随机数生成函数
  10. 包建强的培训课程(12):iOS深入学习(内存管理、Block和GCD等)
  11. Prism框架中加载类库中时其中第三方类dll提示无法加载程序集
  12. hibernate框架学习之数据查询(HQL)helloworld
  13. IDEA控制台问题:java lang OutOfMemoryError:PermGen space
  14. (转).net反编译工具JustDecompile
  15. [Bayes] qgamma &amp; rgamma: Central Credible Interval
  16. Git push -u orign master 提示hint: not have locally. This is usually caused by another repository push
  17. struts2中s:select标签的使用
  18. JavaScript学习笔记(六)—— 异步编码
  19. TED_Topic3:The hidden reason for poverty the world needs to address now
  20. [原]Redis使用场景及使用经验

热门文章

  1. 【Linux】【Services】【Docker】基础理论
  2. 『学了就忘』Linux服务管理 — 77、RPM包安装基于xinetd的服务的管理
  3. Mac 下安装Phonegap开发环境
  4. 2020ACTF pwn writeup
  5. [BUUCTF]PWN——level4
  6. Amazing!!CSS 也能实现极光?
  7. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
  8. generating project in interactive mode
  9. 复杂SQL案例:用户退款信息查询
  10. Linux使用SCP命令不使用密钥直接进行远程复制(SSH免密登录)