Map是一个由键值对组成的数据结构,且在每个集合中键是唯一的。
为测试以下功能,开始一个具有JUnit测试功能的类
import org.junit.Test;
public class MapTest {
private Map<String, Object> map = new HashMap<String, Object>();
public MapTest() {
map.put("userName", "admin");
map.put("password", "123456");
map.put("age", 11);
}
}
0、将Map转化为List类型
在Java中Map提供了三种集合的获取方式:key set , value set , key-value set.它们都可以通过构造方法或者addAll(Collection<? extends E> c)方法来转化为List类型。
@Test
public void map2list() {
List<String> keyList = new ArrayList<String>(map.keySet());
for (String key : keyList) {
System.out.print("[" + key + "]");
}
System.out.println();
List<Object> valueList = new ArrayList<Object>(map.values());
for (Object value : valueList) {
System.out.print("[" + value + "]");
}
System.out.println();
List<Entry<String, Object>> entryList = new ArrayList<Entry<String, Object>>(
map.entrySet());
for (Entry<String, Object> entry : entryList) {
System.out.print("[" + entry + "]");
}
}
运行结果:
[age][userName][password]
[11][admin][123456]
[age=11][userName=admin][password=123456]
1、遍历Map集合
通过几种最常用的方法进行遍历
@Test
public void circleMap() {
for (Entry<String, Object> entry : map.entrySet()) {
System.out.print("[" + entry.getKey() + "," + entry.getValue()
+ "]");
}
System.out.println();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.print("[" + key + "," + map.get(key) + "]");
}
System.out.println();
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.print("[" + key + "," + map.get(key) + "]");
}
}
运行结果:
[age,11][userName,admin][password,123456]
[age,11][userName,admin][password,123456]
[age,11][userName,admin][password,123456]
2、根据Key来对Map排序
@Test
public void compareByKey() {
List<Entry<String, Object>> list = new ArrayList<Entry<String, Object>>(
map.entrySet());
Collections.sort(list, new Comparator<Entry<String, Object>>() {
@Override
public int compare(Entry<String, Object> e1,
Entry<String, Object> e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
for (Entry<String, Object> entry : list) {
System.out.print("[" + entry.getKey() + "," + entry.getValue()
+ "]");
}
System.out.println();
SortedMap<String, Object> sortedMap = new TreeMap<String, Object>(
new Comparator<String>() {
@Override
public int compare(String k1, String k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(map);
Iterator<String> iterator = sortedMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.print("[" + key + "," + sortedMap.get(key) + "]");
}
}
运行结果:
[age,11][password,123456][userName,admin]
[age,11][password,123456][userName,admin]
3、根据Value来对Map进行排序
由于初始化Map对象中的Value值有不同的类型,所以在比较过程中做了一些处理,全部转为String类型比较。
@Test
public void compareByValue() {
List<Entry<String, Object>> list = new ArrayList<Entry<String, Object>>(
map.entrySet());
Collections.sort(list, new Comparator<Entry<String, Object>>() {
@Override
public int compare(Entry<String, Object> e1,
Entry<String, Object> e2) {
String value1 = "", value2 = "";
if (e1.getValue() instanceof Integer) {
value1 = Integer.toString((Integer) e1.getValue());
} else {
value1 = (String) e1.getValue();
}
if (e2.getValue() instanceof Integer) {
value2 = Integer.toString((Integer) e2.getValue());
} else {
value2 = (String) e2.getValue();
}
return value1.compareTo(value2);
}
});
for (Entry<String, Object> entry : list) {
System.out.print("[" + entry.getKey() + "," + entry.getValue()
+ "]");
}
}
运行结果:
[age,11][password,123456][userName,admin]
4、初始化一个static的常量map
有两种方式声明一个全局静态的Map,且都是线程安全的。
在MapStaticFinalstst.java中,第一种方式声明的可以在任何地方修改map里面的值
package com.code.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class MapStaticFinalstst {
private static final Map<Object, Object> map;
static {
map = new HashMap<Object, Object>();
map.put("1", "st");
map.put("2", "nd");
}
public static void main(String[] args) {
map.put("3", "rd");
for (Entry<Object, Object> entry : map.entrySet()) {
System.out.print("[" + entry.getKey() + "," + entry.getValue()
+ "]");
}
}
}
运行结果:
[3,rd][2,nd][1,st]
在MapStaticFinalstnd.java中,unmodifiableMap返回指定映射的不可修改视图,当我们尝试修改map数据时,会发生异常。
package com.code.map;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class MapStaticFinalstnd {
private static final Map<Object, Object> map;
static {
Map<Object, Object> aMap = new HashMap<Object, Object>();
aMap.put("1", "st");
aMap.put("2", "nd");
map = Collections.unmodifiableMap(aMap);
}
public static void main(String[] args) {
map.put("3", "rd");
for (Entry<Object, Object> entry : map.entrySet()) {
System.out.print("[" + entry.getKey() + "," + entry.getValue()
+ "]");
}
}
}
运行结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.put(Unknown Source)
at com.code.map.MapStaticFinalstnd.main(MapStaticFinalstnd.java:19)