文档章节

java中关于Map的九大问题

LCZ777
 LCZ777
发布于 2014/08/11 21:46
字数 997
阅读 45
收藏 0
通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的。下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题。


0、将Map转换为List类型

在java中Map接口提供了三种集合获取方式:Key set,,value set, and key-value set
.。它们都可以通过构造方法或者 addAll() 方法来转换为List类型。下面代码就说明了如何从Map中构造ArrayList:

// key list List keyList = new ArrayList(map.keySet()); 
// value list List valueList = new ArrayList(map.valueSet()); 
// key-value list List entryList = new ArrayList(map.entrySet());

1、通过 Entry  遍历Map

java中这种以键值对存在的方式被称为
Map.Entry Map . entrySet() 返回的是一个 key-value  集合,这是一种非常高效的遍历方式。

for(Entry entry: map.entrySet()) { 
// get key K key = entry.getKey(); 
// get value V value = entry.getValue(); 
}

Iterator 我们也经常用到,尤其是在JDK1.5以前

Iterator itr = map.entrySet().iterator(); 
while(itr.hasNext()) { 
Entry entry = itr.next(); 
// get key K key = entry.getKey(); 
// get value V value = entry.getValue(); 
}

2、通过Key来对Map排序

排序需要对Map的ke进行频繁的操作,一种方式就是通过比较器(
comparator  )来实现:

List list = new ArrayList(map.entrySet()); 
Collections.sort(list, new Comparator() {  
  @Override public int compare(Entry e1, Entry e2) {
 return e1.getKey().compareTo(e2.getKey()); }   });

另外一种方法就是通过 SortedMap ,但必须要实现 Comparable 接口。

SortedMap sortedMap = new TreeMap(new Comparator() {  
  @Override public int compare(K k1, K k2) { 
return k1.compareTo(k2); }   }); 
sortedMap.putAll(map);

3、对value对Map进行排序

这与上一点有些类似,代码如下:


List list = new ArrayList(map.entrySet()); 
Collections.sort(list, new Comparator() {  
  @Override public int compare(Entry e1, Entry e2) { 
return e1.getValue().compareTo(e2.getValue()); }   });



4、初始化一个static 的常量Map

当你希望创建一个全局静态Map的时候,我们有以下两种方式,而且是线程安全的。
而在Test1中,我们虽然声明了map是静态的,但是在初始化时,我们依然可以改变它的值,就像
Test1.map.put(3,"three");
在Test2中,我们通过一个内部类,将其设置为不可修改,那么当我们运行 Test2.map.put(3,"three") 的时候,它就会抛出一个 UnsupportedOperationException   异常来禁止你修改。

public class Test1 {   
private static final Map map; 
static { map = new HashMap(); 
map.put(1, "one"); map.put(2, "two"); 
} }  
public class Test2 {   
private static final Map map; 
static { Map aMap = new HashMap(); 
aMap.put(1, "one"); 
aMap.put(2, "two"); 
map = Collections.unmodifiableMap(aMap); 
} }
5、HashMap, TreeMap, and Hashtable之间的不同

在Map接口中,共有三种实现:HashMap,TreeMap,Hashtable。
它们之间各有不同,详细内容请参考《 
HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap 》一文。

6、Map中的反向查询


我们在Map添加一个键值对后,意味着这在Map中键和值是一一对应的,一个键就是对应一个值。但是有时候我们需要反向查询,比如通过某一个值来查找它的键,这种数据结构被称为 bidirectional map ,遗憾的是JDK并没有对其支持。
Apache和
Guava 共同提供了这种 bidirectional map 实现,它在实现中它规定了键和值都是必须是1:1的关系。

7、对Map的复制

java中提供了很多方法都可以实现对一个Map的复制,但是那些方法不见得会时时同步。简单说,就是一个Map发生的变化,而复制的那个依然保持原样。下面是一个比较高效的实现方法:


Map copiedMap = Collections.synchronizedMap(map);

当然还有另外一个方法,那就是克隆。但是我们的java鼻祖 Josh Bloch 却不推荐这种方式,他曾经在一次访谈中说过关于Map克隆的问题:在很多类中都提供了克隆的方法,因为人们确实需要。但是克隆非常有局限性,而且在很多时候造成了不必要的影响。(原文《 Copy constructor versus cloning 》)

8、创建一个空的Map

如果这个map被置为不可用,可以通过以下实现


map = Collections.emptyMap();

相反,我们会用到的时候,就可以直接

map = new HashMap();

本文转载自:

LCZ777
粉丝 54
博文 248
码字总数 65899
作品 0
杭州
程序员
私信 提问
Java 线程本地 ThreadLocal 的分析和总结

ThreadLocal类在Spring,Hibernate等框架中起到了很大的作用,对于其工作原理,很多网上的文章分析的不够彻底,甚至有些误解。 首先,为了解释ThreadLocal类的工作原理,必须同时介绍与其工作...

绿悠悠
2010/10/07
3.1K
0
ThreadLocal源码分析

阅读原文请访问我的博客 BrightLoong's Blog 一. 简介 提醒篇幅较大需耐心。 简介来自ThreadLocal类注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线...

BrightLoong
2018/05/28
0
0
通过ThreadLocal解决servlet请求内部各类之间共享request等对象

场景如下:在java后台处理业务的时候,需要调用当前登录用户的一些信息,一般情况下的做法是,在登录的时候,把登录对象放到HttpSession对象中,在需要调用的时候,从request或者session对象...

傲娇字符
2014/06/09
4K
4
java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下

目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze 序:使用java的Map做缓存,你是否考虑过容量导致的OOM问题,是否考虑命中率对性能的影响?? ...

intsmaze(刘洋)
2018/08/16
0
0
Thread(threadlocal)

1、简介 JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一...

开源中国首席碉堡了
2018/11/28
71
0

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
21分钟前
3
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
27分钟前
3
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
34分钟前
4
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
37分钟前
3
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部