Top 6 常见问题关于Java中的Map1 将Map转换成一个List2 遍历map中的键值对3 根据Map的key值排序4 根据Map的value值排序5 初始化一个静态的不可变的Map6 Has

我们都知道Map是一种键-值对的数据结构,每个键都是唯一的!本文讨论了关于Java中Map使用的最常见的8个问题。为了叙述的简单,所有的例子都会使用泛型。并且本文出现的泛型符号 K,V,都是继承实现Comparable接口的!

1 将Map转换成一个List

Java中,Map接口提供了三个集合表现:

  • key set
  • value set
  • key-value 这三个都可以被转换为List通过使用构造函数初始化或者addAll方法。下面这段简单的代码段向我们展示了如何从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());

2 遍历map中的键值对

遍历一个map中的键值对是最基本的操作。为此,在java中,所有这些键值对都存储在Map.Entry的实例中,我们调用Map.entrySet() 就会返回一个存储着所有键值对的对象,然后遍历循环就可以得到了。

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

在jDK1.5之前我们也可以使用Iterator

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

3 根据Map的key值排序

根据map的key值将map进行排序是一个很常用的操作。 一个方法就是将Map.Entry转换到一个list里去,然后list排序就可以了。 如下面的例子:

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,这种collection会将所有的key按照给定的排序comparator进行排序。所以sortedMap中的key必须实现了comparable接口,或者实现comparator。 sortedMap的一个实例类就是TreeMap,他的构造函数可以接受一个comparator参数,下面的代码说明了怎样将一个普通的Map转换成sortedmap。

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

4 根据Map的value值排序

第一种方法也是将map转换成一个list,然后根据value排序,方法与key的排序是一样的。

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());
}
});

显然key的第二种方法也是可以适用的,但必须要求值是唯一的,我们也可以将key和value进行反转,但是并不推荐这样做。

5 初始化一个静态的不可变的Map

如果你需要一个map像静态常量那样保持不变,那么我们将它复制到一个immutable的map中,也就是不可变Map。这样做不仅可以帮我们保证使用时的不变性,同时还可以起到线程安全的作用。

初始化一个static/immutable的map的时候,我们可以使用一个static修饰符。 问题在于,虽然我们将map声明为static,但是这个map仍然可以被操作,比如 map.put(3,"three");因此,这个map还不是真正意义上不可变的。为了创建一个不可变的map,我们需要static修饰符,同时需要一个额外的匿名类,并且在最后一步将其复制到一个不可以操作的map中。

public class Test {
private static final Map map;
static {
map = new HashMap();
map.put(1, "one");
map.put(2, "two");
}
}
public class Test {
private static final Map map;
static {
Map aMap = new HashMap();
aMap.put(1, "one");
aMap.put(2, "two");
map = Collections.unmodifiableMap(aMap);
}
}

6 HashMap TreeMap HashTable的对比

java中的Map的实现主要有三种,分别是HashMap TreeMap HashTable,最重要的差别有以下几方面:

  • 迭代的顺序。hashMap和HashTable迭代是,是无序的,无法预测会以特定的顺序进行迭代。但是treemap迭代的时候,是有序的,会按照key的comparator给定的排序规则进行排序。
  • key-value的范围。hashmap允许key为null和value为null,而且只允许一个一个key为null,因为map不可以有两个相同的键值啊!。hashtable不允许有key为null或者value为null。TreeMap同样也不允许有key为null或者value为null
  • 同步。只有Hashtable是同步,也就是线程安全的,其他两个都不是。因此,如果我们需要一个线程安全的map,那我们需要使用hashtable,如果不需要线程安全,那更推荐使用hashmap和hashtable。

Paste_Image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java ArrayList的不同排序方法

由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一。ArrayList 是一种 List 实现,它的内部用一个动态数组来存...

1432
来自专栏大闲人柴毛毛

剑指 offer代码解析——面试题37两个链表的第一个公共结点

本题的详细解析均在代码注释中: import java.util.Stack; /** * 题目:输入两个链表,找出他们的第一个公共结点 * @autho...

3165
来自专栏算法修养

2016天梯模拟赛 进阶题解

L2-005 集合相似度 题目链接: https://www.patest.cn/contests/gplt/L2-005 题目的意思是要求两个集合的交集中...

4279
来自专栏大闲人柴毛毛

剑指offer代码解析——面试题16反转单链表

本题的详细解析均在代码中注释: /** * 题目:将单链表反转,并输出反转后链表的头结点 * @author 大闲人柴毛毛 */ public class...

41111
来自专栏Android群英传

深入Java源码解析容器类List、Set、Map

2133
来自专栏Java进阶之路

一道有趣的Map迭代题

2080
来自专栏Java爬坑系列

【Java入门提高篇】Day20 Java集合类详解(三)List接口

  今天要说的是Collection族长下的三名大将之一,List,Set,Queue中的List,它们都继承自Collection接口,所以Collectio...

2417
来自专栏LinkedBear的个人空间

唠唠SE的集合-01——Collection接口

当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常,所以jdk1.5加入了泛型机制。

682
来自专栏黑泽君的专栏

java基础学习_集合类03_用户登录注册案例(集合版)、Set集合、Collection集合总结_day17总结

============================================================================= ==...

1052
来自专栏小怪聊职场

Java|Map、List与Set的区别

44412

扫码关注云+社区

领取腾讯云代金券