Java--Map的使用认知
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
切记 学习之路,少就是多 慢就是快!
Java--Map的使用认知的更多相关文章
- java Map实现的cache manager
一个模仿memcached的JAVA虚拟缓存工具,可以缓存java对象 import java.io.ByteArrayInputStream; import java.io.ByteArrayOut ...
- Java map 详解 - 用法、遍历、排序、常用API等
尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...
- java map遍历、排序,根据value获取key
Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...
- java Map常用方法封装
java Map常用方法封装 CreationTime--2018年7月16日15点59分 Author:Marydon 1.准备工作 import java.util.HashMap; impo ...
- Java Map获取key和value 以及String字符串转List方法
一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法 2. ...
- java map添加另一个map时候 键值对的类型要一致
java map添加另一个map时候 键值对的类型要一致
- java:Map借口及其子类HashMap五,identityHashMap子类
java:Map借口及其子类HashMap五,identityHashMap子类 了解:identityHashMap子类 一般情况下,标准的Map,是不会有重复的key值得value的,相同的key ...
- java:Map借口及其子类HashMap四
java:Map借口及其子类HashMap四 使用非系统对象作为key,使用匿名对象获取数据 在Map中可以使用匿名对象找到一个key对应的value. person: public class Ha ...
- java:Map借口及其子类HashMap二
java:Map借口及其子类HashMap二 重点:所有的集合必须依赖Iterator输出 Map<String, Integer> map = new HashMap<String ...
- java:Map借口及其子类
java:Map借口及其子类 Conllection是保存单值最大得父接口(即没有key的数据),那么Map是保存的内容是一对键值的数据,即KEY->VALUE的形式保存,如电话簿等. Map常 ...
随机推荐
- 【Linux】【Services】【Docker】Docker File
Docker Images: docker commit Dockerfile:文本文件,镜像文件构建脚本: Dockerfile:由一系列用于根据基础镜像构建新的镜像文件的专用指令序列组成: 指令: ...
- springboot-MVC 过滤器使用
一.前言 一下代码以SSO用户登录列子代码.完整代码https://gitee.com/xuxueli0323/xxl-sso 二.使用 2.1 创建过滤器 创建一个过滤器,实现Filter 接口 p ...
- 什么是微服务,SpringBoot和SpringCloud的关系和区别
什么是微服务? 就目前而言对于微服务业界没有一个统一的,标准的定义.但通常而言,微服务是一种架构模式或者说是一种架构风格,它提倡单一应用程序划分为一组小的服务,每个服务在其独立的自己的进程中,服务之间 ...
- 2.ElasticSearch集群的搭建
1.创建elasticsearch-cluster文件夹,在内部复制三个elasticsearch服务 2.修改elasticsearch-cluster\node*\config\elasticse ...
- 1、Redis简介
一.NOSQL 1.什么是NOSQL? NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 指的是非关系型的数据库.NoSQL有时也称作Not On ...
- 记ByteCTF中的Node题
记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...
- 转:select、poll、epoll之间的区别总结[整理]
转:select.poll.epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就 ...
- Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式
系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...
- 转置Table.Transpose(Power Query 之 M 语言)
数据源: 任意五行两列 目标: 转置成两行五列 操作过程: [转换]>[转置] M公式: = Table.Transpose( 表 )
- mail如何在linux中发送邮件,使用163邮箱发信。
如何在linux中发送邮件,使用163邮箱发信. linux中,可以使用mail命令往外发送邮件,在使用前,只需要指定如下简单配置即可,这里演示用 163.com 邮箱发送至 qq.com ...