Java集合(6):理解Map
映射表的基本思想是维护键-值对的关联,通过键来寻找值。下面是标准Java类库中几种Map的实现:
(1) HashMap:Map基于散列表的实现,插入和查询键值对的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器性能。它是默认选择。
(2) LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得的键值对的顺序是插入它的顺序,或者是最近最少使用(LRU)顺序,没有被访问过的元素会排在最前面,以便删除。比HashMap慢一点,而在迭代访问时反而更快,因为它使用链表维护内部次序。
(3) TreeMap:基于红黑树的实现。查询键或键值对时,它们会被排序,次序由实现Comparable接口的键或构造器参数Comparator<key>决定。TreeMap所得到的结果是经过排序的,TreeMap是唯一带有subMap()方法的Map,可以返回一个子树。
(4) WeakHashMap:弱键(weak key)映射,允许映射释放所指向的对象,这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个键,则此键可以被垃圾回收。
(5) ConcurrentHashMap:一种线程安全的Map,它不涉及同步加锁。
(6) IdentityHashMap:使用==代替equals()对键进行比较的散列映射。
下面是两个例子,分别举例了TreeMap和LinkedHashMap的用法。
import java.util.Iterator;
import java.util.TreeMap; public class Test7 { public static void main(String[] args) {
TreeMap<Integer, String> sortedMap = createMapData(); // 默认按照key排序,key必须实现Comparable接口
System.out.println(sortedMap); // {1=Beijing, 2=Shanghai, 3=Shenzhen, 4=Guangzhou, 5=Tianjin, 6=Nanjing, 7=Hangzhou, 8=Suzhou, 9=Chengdu, 10=Wuhan}
Integer low = sortedMap.firstKey();
Integer high = sortedMap.lastKey();
System.out.println(low); //
System.out.println(high); //
Iterator<Integer> it = sortedMap.keySet().iterator();
for (int i = 0; i <= 6; i++) {
if (i == 4)
low = it.next();
if (i == 6)
high = it.next();
else
it.next();
}
System.out.println(low); //
System.out.println(high); //
System.out.println(sortedMap.subMap(low, high)); // {5=Tianjin, 6=Nanjing, 7=Hangzhou}
System.out.println(sortedMap.headMap(high)); // {1=Beijing, 2=Shanghai, 3=Shenzhen, 4=Guangzhou, 5=Tianjin, 6=Nanjing, 7=Hangzhou}
System.out.println(sortedMap.tailMap(low)); // {5=Tianjin, 6=Nanjing, 7=Hangzhou, 8=Suzhou, 9=Chengdu, 10=Wuhan}
} private static TreeMap<Integer, String> createMapData() {
TreeMap<Integer, String> result = new TreeMap<>();
result.put(3, "Shenzhen");
result.put(6, "Nanjing");
result.put(1, "Beijing");
result.put(9, "Chengdu");
result.put(2, "Shanghai");
result.put(10, "Wuhan");
result.put(5, "Tianjin");
result.put(7, "Hangzhou");
result.put(4, "Guangzhou");
result.put(8, "Suzhou");
return result;
}
}
public class Test8 {
public static void main(String[] args) {
// 插入顺序
LinkedHashMap<Integer, String> linkedMap = createMapData();
System.out.println(linkedMap); // {3=Shenzhen, 6=Nanjing, 1=Beijing, 9=Chengdu, 2=Shanghai, 10=Wuhan, 5=Tianjin, 7=Hangzhou, 4=Guangzhou, 8=Suzhou}
// LRU(初始容量, 负载因子, LRU flag)
linkedMap = new LinkedHashMap<Integer, String>(16, 0.75f, true);
linkedMap.putAll(createMapData());
System.out.println(linkedMap); // {3=Shenzhen, 6=Nanjing, 1=Beijing, 9=Chengdu, 2=Shanghai, 10=Wuhan, 5=Tianjin, 7=Hangzhou, 4=Guangzhou, 8=Suzhou}
for (int i = 1; i <= 4; i++) {
linkedMap.get(i);
}
System.out.println(linkedMap); // {6=Nanjing, 9=Chengdu, 10=Wuhan, 5=Tianjin, 7=Hangzhou, 8=Suzhou, 1=Beijing, 2=Shanghai, 3=Shenzhen, 4=Guangzhou}
}
private static LinkedHashMap<Integer, String> createMapData() {
LinkedHashMap<Integer, String> result = new LinkedHashMap<>();
result.put(3, "Shenzhen");
result.put(6, "Nanjing");
result.put(1, "Beijing");
result.put(9, "Chengdu");
result.put(2, "Shanghai");
result.put(10, "Wuhan");
result.put(5, "Tianjin");
result.put(7, "Hangzhou");
result.put(4, "Guangzhou");
result.put(8, "Suzhou");
return result;
}
}
Java集合(6):理解Map的更多相关文章
- Java 集合深入理解(4):List<E> 接口
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 08 Map架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合深入理解(8):AbstractSequentialList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...
- Java 集合深入理解(7):ArrayList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- Java 集合深入理解(14):Map 概述
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...
- Java 集合深入理解(15):AbstractMap
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天来了解下 AbstractMap. 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类 ...
- Java 集合深入理解(3):Collection
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...
随机推荐
- Vue入门(一)——环境搭建
1.参考该教程装vue脚手架和创建工程 https://segmentfault.com/a/1190000008922234 附:在每个工程下cmd,执行npm install,此时工程下会多一个n ...
- setTimeout,promise,promise.then, async,await执行顺序问题
今天下午看了好多关于这些执行顺序的问题 经过自己的实践 终于理解了 记录一下就拿网上出现频繁的代码来说: async function async1() { console.log('async1 ...
- shell字符串处理
一.字符串切片: ${#var}:返回字符串变量var的长度${var:offset}:返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,offse ...
- 利用collections下的counter实现对列表重复元素的查重
mylist = [0,1,1,2,2,3,3,3,3,4,5,6,7,7,8,8,9,10,10,11,22,33,22] from collections import Counter c = C ...
- 牛客练习赛3 绝对半径 ——k尺取法
题目 链接 题意:一个n个数字的序列,最多去掉其中k个,使得连续相同数字序列的长度尽量长 分析 如果不考虑去掉元素,就是普通的尺取.考虑到去元素,则只需做一点修改. 先离散化,再把每种元素的位置用va ...
- 04 JQuery的使用
01 对网站首页优化--定时弹出广告 <!-- 作者:offline 时间:2018-09-09 描述:在使用JQ前要导入jquery-1.11.0.min.js包 注意区分js和jq的对象 - ...
- python 学习资料 常用
https://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html 利用python 进行数据分析第二版 https://www.jianshu ...
- luogu 2519 [HAOI2011]problem a 动态规划+树状数组
发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数 ...
- element-ui做表单验证 v-for遍历表单 自动生成校验规则 pc移动双适配
整体思路: 1:利用element-ui的栅格实现小分辨率和大分辨率的适配 2:模拟一组数据,从中筛选出 绑定各个表单值的对象 以及生成验证规则对象 3:在script标签内 .data()外,自 ...
- JAVA的面向对象1
如何理解面向对象 我们说面向对象具有三大特征:封装性.继承性和多态性,那么我们怎么去理解所谓的封装.继承.多态? 1.封装:功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可. 如:房子.电 ...