映射表的基本思想是维护键-值对的关联,通过键来寻找值。下面是标准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的更多相关文章

  1. Java 集合深入理解(4):List<E> 接口

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 蓝瘦!香菇! 连着加班几天,醉了.学学 List 放松下! 在 Java 集合深入理解:Collection 中我们熟悉了 ...

  2. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  3. Java 集合系列 15 Map总结

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. Java 集合深入理解(8):AbstractSequentialList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...

  6. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  7. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  8. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...

  9. Java 集合深入理解(15):AbstractMap

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天来了解下 AbstractMap. 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类 ...

  10. Java 集合深入理解(3):Collection

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...

随机推荐

  1. kvm批量创建虚拟主机

    1.首先你的提前创建一个kvm虚拟机主机,才能批量复制创建 批量复制已经安装好的系统盘 `;.img centos7-$i.img && echo $i ;done 批量复制已经安装好 ...

  2. redis cluster 介绍

    介绍 1. cluster的作用 (1)自动将数据进行分片,每个master上放一部分数据 (2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的 2. redis集群实现方案 关于 ...

  3. 开发中少不了的Fun -- js判断设备

    判断是否是移动设备 var ua = window.navigator.userAgent.toLowerCase(); if(ua.indexOf('mobile')!== -1){ return ...

  4. 正整数n拆分成几个不同的平方数——DFS&&打表

    考虑将正整数n拆分成几个不同的平方数之和,比如30=1^2 + 2^2 + 5^2=1^2 + 2^2 + 3^2 + 4^2,而8不存在这样的拆分. #include<bits/stdc++. ...

  5. BZOJ 1845: [Cqoi2005] 三角形面积并 (辛普森积分)

    大力辛普森积分 精度什么的搞了我好久- 学到了Simpson的一个trick 深度开11,eps开1e-4.跑的比有些扫描线还快- CODE #include <bits/stdc++.h> ...

  6. Git始终忽略特定文件的某一行内容

    笔者在编写Z Shell文件的时候经常会使用到set -x来开启调试,但不希望提交到仓库 解决方案 Git提供了一种文件过滤器,此方法可以帮助在提交时移除set -x 我们先来编写脚本,如何移除这一行 ...

  7. Luogu P2567 [SCOI2010]幸运数字 容斥+脑子

    双倍经验:BZOJ 2393 Cirno的完美算数教室 做法:先把$[1,r]$中所有的幸运数字筛出来,然后用这些幸运数字来筛$[l,r]$中的近似幸运号码: 剪枝:当一个幸运数字$a[i]$是另一个 ...

  8. MySQL多表查询总结

    MySQL术语: Redundacncy(冗余):存储两次或多次数据,以便实现快速查询. Primary Key(主键):主键是唯一的.表中每条记录的唯一标识. Foreign Key(外键):用于连 ...

  9. linux系统编程--信号

    信号的概念 man 7 siganl  查看man手册 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪......他们都有共性:1. 简单 2. 不能 ...

  10. css 能改变input type radio和checkbox 圆圈或方框的大小

    把input隐藏,外面套label,再里面加个span,样式写在span上,让label覆盖在span上面,js去改active的class <label for="remember& ...