1、Entry、keySet、entrySet概念
Entry
Entry是Map的一个内部接口,Entry中有getKey()、getValue、setValue方法。
HashMap中的内部类Node就是实现了Entry接口,Node用于存储HashMap中的节点信息,包含哈希值、键值对和指向下一个节点的指针,源码如下:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
public final K getKey() { return key; }
public final V getValue() { return value; }
public final String toString() { return key + "=" + value; }
public final V setValue(V newValue) {
V oldValue = value;
value = newValue;
return oldValue;
}
/*省略构造函数、hashCode、equals方法*/
}
HashMap的完整源码解析参考之前的博客:HashMap源码解析
keySet()
keySet()方法返回值是Map中key值的集合;
entrySet()
entrySet()方法返回值是Entry集合,可以通过getKey()、getValue获取到Entry中的键和值。
2、根据key或value对Map排序
- 对key排序可以利用TreeMap实现,TreeMap默认按照升序排序,可以调用descendingMap方法变成降序排序。当然也可以使用value相同的排序方式。
- 对value排序先调用entrySet将Entry集合放入List中,然后重写List的Comparator方法实现降序排序。
3、示例代码
public class SortMapDemo {
//获取KeySet
private static void getKeySet(Map<Integer,Integer> map){
//获取map的key的集合
Set<Integer> keySet = map.keySet();
//遍历输出key
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
System.out.println(next+":"+map.get(next));
}
}
//获取EntrySet
private static void getEntrySet(Map<Integer,Integer> map){
//获取map的entry的集合
Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
//遍历输出entry中的key和value
Iterator<Map.Entry<Integer, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> next = iterator.next();
System.out.println(next.getKey()+":"+next.getValue());
}
}
//按照value进行排序
private static void sortByValue(Map<Integer,Integer> map) {
//将键值对放入list中
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
//重写list的排序算法,按照map中的value降序排列
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
//遍历list输出键值
for (Map.Entry<Integer, Integer> e: list) {
System.out.println(e.getKey()+":"+e.getValue());
}
}
//按照key进行排序
private static void sortByKey(Map<Integer,Integer> map) {
Map<Integer,Integer> treeMap = new TreeMap<>(map);
//实现按照key倒序排列
treeMap = ((TreeMap<Integer, Integer>) treeMap).descendingMap();
//遍历list输出键值
for (Map.Entry<Integer, Integer> e : treeMap.entrySet()) {
System.out.println(e.getKey()+":"+e.getValue());
}
}
public static void main(String[] args) {
Map<Integer,Integer> map = new HashMap<>();
map.put(1, 2);
map.put(3, 3);
map.put(2, 1);
System.out.println("getKeySet");
getKeySet(map);
System.out.println("getEntrySet");
getEntrySet(map);
System.out.println("sortByValue");
sortByValue(map);
System.out.println("sortByKey");
sortByKey(map);
}
}