java中Map集合的常用方法總結(jié)大全
1、如何把一個(gè)Map轉(zhuǎn)化為L(zhǎng)ist
日常開發(fā)中,我們經(jīng)常遇到這種場(chǎng)景,把一個(gè)Map轉(zhuǎn)化為L(zhǎng)ist。map轉(zhuǎn)List有以下三種轉(zhuǎn)化方式:
把map的鍵key轉(zhuǎn)化為list
把map的值value轉(zhuǎn)化為list
把map的鍵值key-value轉(zhuǎn)化為list
示例代碼:
//語法
/**
key 轉(zhuǎn)list
List keyList = new ArrayList(map.keySet());
value轉(zhuǎn)list
List valueList = new ArrayList(map.values());
//map轉(zhuǎn)list
List entryList = new ArrayList(map.entrySet());
*/
public class Test {
public static void main(String[] args) {
Map<Integer,String> userMap=new HashMap<>();
userMap.put(1, "劉備");
userMap.put(2, "諸葛亮");
userMap.put(3, "關(guān)羽");
userMap.put(4, "張飛");
userMap.put(5, "趙云");
userMap.put(6, "黃忠");
userMap.put(7, "馬超");
//把一個(gè)map的鍵轉(zhuǎn)化成list
List<Integer>keyList=new ArrayList<>(userMap.keySet());
System.out.println(keyList);
//把一個(gè)map的值轉(zhuǎn)化成list
List<String> valueList = new ArrayList<>(userMap.values());
System.out.println(valueList);
//把map的鍵值轉(zhuǎn)化成list
List entryList=new ArrayList(userMap.entrySet());
System.out.println(entryList);
}
}
------------------------------------------------------------------------
// 結(jié)果:
[1, 2, 3, 4, 5, 6, 7]
[劉備, 諸葛亮, 關(guān)羽, 張飛, 趙云, 黃忠, 馬超]
[1=劉備, 2=諸葛亮, 3=關(guān)羽, 4=張飛, 5=趙云, 6=黃忠, 7=馬超] 2、如何遍歷一個(gè)Map
我們經(jīng)常需要遍歷一個(gè)map,可以有以下兩種方式實(shí)現(xiàn):
通過entrySet+for實(shí)現(xiàn)遍歷
public class Test {
public static void main(String[] args) {
Map<Integer,String> userMap=new HashMap<>();
userMap.put(1, "劉備");
userMap.put(2, "諸葛亮");
userMap.put(3, "關(guān)羽");
userMap.put(4, "張飛");
userMap.put(5, "趙云");
userMap.put(6, "黃忠");
userMap.put(7, "馬超");
//把一個(gè)map的鍵轉(zhuǎn)化成list
List<Integer>keyList=new ArrayList<>(userMap.keySet());
// System.out.println(keyList);
//把一個(gè)map的值轉(zhuǎn)化成list
List<String> valueList = new ArrayList<>(userMap.values());
// System.out.println(valueList);
//把map的鍵值轉(zhuǎn)化成list
List entryList=new ArrayList(userMap.entrySet());
// System.out.println(entryList);
// for (Object o : entryList) {
// String[] str=String.valueOf(o).split("=");
// System.out.println(str[0]);
// System.out.println(str[1]);
// }
for(Map.Entry entry:userMap.entrySet()){
System.out.println(entry);
}
}
}
-----------------------------------------------
結(jié)果:
1=劉備
2=諸葛亮
3=關(guān)羽
4=張飛
5=趙云
6=黃忠
7=馬超通過Iterator+while實(shí)現(xiàn)遍歷
public class Test {
public static void main(String[] args) {
Map<Integer,String> userMap=new HashMap<>();
userMap.put(1, "劉備");
userMap.put(2, "諸葛亮");
userMap.put(3, "關(guān)羽");
userMap.put(4, "張飛");
userMap.put(5, "趙云");
userMap.put(6, "黃忠");
userMap.put(7, "馬超");
Iterator iterator=userMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry entry=(Map.Entry)iterator.next();
//get key
Integer key=(Integer) entry.getKey();
//get value
String value=(String) entry.getValue();System.out.println("key:"+key+",value:"+value);
}
}
}
------------------------------------------------------------
//結(jié)果:
key:1,value:劉備
key:2,value:諸葛亮
key:3,value:關(guān)羽
key:4,value:張飛
key:5,value:趙云
key:6,value:黃忠
key:7,value:馬超 3、如何根據(jù)Map的keys進(jìn)行排序
對(duì)Map的keys進(jìn)行排序,在日常開發(fā)很常見,主要有以下兩種方式實(shí)現(xiàn)。
把Map.Entry放進(jìn)list,再用Comparator對(duì)list進(jìn)行排序
public class Test {
public static void main(String[] args) {
Map<String,String> userMap=new HashMap<>();
userMap.put("104", "諸葛亮");
userMap.put("106", "關(guān)羽");
userMap.put("105", "張飛");
userMap.put("107", "趙云");
userMap.put("103", "黃忠");
userMap.put("102", "馬超");
userMap.put("101", "劉備");
List<Map.Entry<String,String>> list=new ArrayList<>(userMap.entrySet());
Collections.sort(list, Comparator.comparing((Map.Entry e) -> e.getKey().toString()));
for(Map.Entry entry:list){
System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
}
}
}
------------------------------------------------
//結(jié)果:
key:101,value:劉備
key:102,value:馬超
key:103,value:黃忠
key:104,value:諸葛亮
key:105,value:張飛
key:106,value:關(guān)羽
key:107,value:趙云使用SortedMap+TreeMap+Comparator實(shí)現(xiàn)
public class Test {
public static void main(String[] args) {
Map<String,String> userMap=new HashMap<>();
userMap.put("104", "諸葛亮");
userMap.put("106", "關(guān)羽");
userMap.put("105", "張飛");
userMap.put("107", "趙云");
userMap.put("103", "黃忠");
userMap.put("102", "馬超");
userMap.put("101", "劉備");
SortedMap sortedMap=new TreeMap(new Comparator<String>(){
@Override
public int compare(String k1, String k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(userMap);
Iterator itr=sortedMap.entrySet().iterator();
while (itr.hasNext()){
Map.Entry entry=(Map.Entry) itr.next();
//get key
String key=(String) entry.getKey();
//get value
String value=(String) entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
}
}
----------------------------------------------
//結(jié)果:
key:101,value:劉備
key:102,value:馬超
key:103,value:黃忠
key:104,value:諸葛亮
key:105,value:張飛
key:106,value:關(guān)羽
key:107,value:趙云4、如何使用Map中的value進(jìn)行排序
public class SortValuesMapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("2010", "jay");
map.put("1999", "whx");
map.put("3010", "huaxiao");
List <Map.Entry<String,String>>list = new ArrayList<>(map.entrySet());
Collections.sort(list, (Map.Entry e1, Map.Entry e2)-> {
return e1.getValue().toString().compareTo(e2.getValue().toString());
}
);
for (Map.Entry entry : list) {
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
}
}
}
5、如何初始化一個(gè)靜態(tài)/不可變的Map
//初始化一個(gè)靜態(tài)不可變的map,單單static final+static代碼塊還是不行的,如下:
public class Test1 {
private static final Map <Integer,String>map;
static {
map = new HashMap<Integer, String>()
map.put(1, "one");
map.put(2, "two");
}
public static void main(String[] args) {
map.put(3, "three");
Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
Map.Entry entry = (Map.Entry) itr.next();
// get key
Integer key = (Integer) entry.getKey();
// get value
String value = (String) entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
}
}
---------------------------------------------
//這里面,map繼續(xù)添加元素(3,"three"),發(fā)現(xiàn)是OK的,運(yùn)行結(jié)果如下:
key:1,value:one
key:2,value:two
key:3,value:three
-----------------------------------------------------------------------
//真正實(shí)現(xiàn)一個(gè)靜態(tài)不可變的map,需要Collections.unmodifiableMap,代碼如下:
public class Test2 {
private static final Map<Integer, String> map;
static {
Map<Integer,String> aMap = new HashMap<>();
aMap.put(1, "one");
aMap.put(2, "two");
map = Collections.unmodifiableMap(aMap);
}
public static void main(String[] args) {
map.put(3, "3");
Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
Map.Entry entry = (Map.Entry) itr.next();
// get key
Integer key = (Integer) entry.getKey();
// get value
String value = (String) entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
}
}
----------------------------------------------------
//真正實(shí)現(xiàn)一個(gè)靜態(tài)不可變的map,需要Collections.unmodifiableMap,代碼如下:
public class Test {
private static final Map<Integer,String> map; //凡是靜態(tài)變量都得初始化
static {
Map<Integer,String>aMap=new HashMap<>();
aMap.put(1,"one");
aMap.put(2,"two");
aMap.put(3,"three");
aMap.put(4,"four");
map = Collections.unmodifiableMap(aMap);
}
public static void main(String[] args) {
map.put(5,"five");
}
Iterator itr=map.entrySet().iterator();
while(itr. hasNext()){
Map.Entry entry = (Map.Entry) itr.next();
// get key
Integer key = (Integer) entry.getKey();
// get value
String value = (String) entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
}
------------------------------------------------
//結(jié)果:
Erro報(bào)錯(cuò)6、如何創(chuàng)建一個(gè)空map
如果map是不可變的,可以這樣創(chuàng)建:
Map map=Collections.emptyMap();
or
Map<String,String> map=Collections.<String, String>emptyMap();
//map1.put("1", "1"); 運(yùn)行出錯(cuò)
---------------------------------
//如果你希望你的空map可以添加元素的,可以這樣創(chuàng)建
Map map = new HashMap();7、有關(guān)于map的復(fù)制
有關(guān)于hashmap的復(fù)制,在日常開發(fā)中,使用也比較多。主要有 =,clone,putAll,但是他們都是淺復(fù)制,使用的時(shí)候注意啦,可以看一下以下例子:
例子一,使用=復(fù)制一個(gè)map:
public class CopyMapAssignTest {
public static void main(String[] args) {
Map<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User("jay", 26));
userMap.put(2, new User("fany", 25));
//Shallow clone
Map<Integer, User> clonedMap = userMap;
//Same as userMap
System.out.println(clonedMap);
System.out.println("\nChanges reflect in both maps \n");
//Change a value is clonedMap
clonedMap.get(1).setName("test");
//Verify content of both maps
System.out.println(userMap);
System.out.println(clonedMap);
}
}
運(yùn)行結(jié)果:
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
Changes reflect in both maps
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
從運(yùn)行結(jié)果看出,對(duì)cloneMap修改,兩個(gè)map都改變了,所以=是淺復(fù)制。
例子二,使用hashmap的clone復(fù)制:
public class CopyCloneMapTest {
public static void main(String[] args) {
HashMap<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User("jay", 26));
userMap.put(2, new User("fany", 25));
//Shallow clone
HashMap<Integer, User> clonedMap = (HashMap<Integer, User>) userMap.clone();
//Same as userMap
System.out.println(clonedMap);
System.out.println("\nChanges reflect in both maps \n");
//Change a value is clonedMap
clonedMap.get(1).setName("test");
//Verify content of both maps
System.out.println(userMap);
System.out.println(clonedMap);
}
} 運(yùn)行結(jié)果:
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
Changes reflect in both maps
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
從運(yùn)行結(jié)果看出,對(duì)cloneMap修改,兩個(gè)map都改變了,所以hashmap的clone也是淺復(fù)制。
例子三,通過putAll操作
public class CopyPutAllMapTest {
public static void main(String[] args) {
HashMap<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User("jay", 26));
userMap.put(2, new User("fany", 25));
//Shallow clone
HashMap<Integer, User> clonedMap = new HashMap<>();
clonedMap.putAll(userMap);
//Same as userMap
System.out.println(clonedMap);
System.out.println("\nChanges reflect in both maps \n");
//Change a value is clonedMap
clonedMap.get(1).setName("test");
//Verify content of both maps
System.out.println(userMap);
System.out.println(clonedMap);
}
}
運(yùn)行結(jié)果:
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
Changes reflect in both maps
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
從運(yùn)行結(jié)果看出,對(duì)cloneMap修改,兩個(gè)map都改變了,所以putAll還是淺復(fù)制。
那么,如何實(shí)現(xiàn)深度復(fù)制呢?
可以使用序列化實(shí)現(xiàn),如下為谷歌Gson序列化HashMap,實(shí)現(xiàn)深度復(fù)制的例子:
public class CopyDeepMapTest {
public static void main(String[] args) {
HashMap<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User("jay", 26));
userMap.put(2, new User("fany", 25));
//Shallow clone
Gson gson = new Gson();
String jsonString = gson.toJson(userMap);
Type type = new TypeToken<HashMap<Integer, User>>(){}.getType();
HashMap<Integer, User> clonedMap = gson.fromJson(jsonString, type);
//Same as userMap
System.out.println(clonedMap);
System.out.println("\nChanges reflect in only one map \n");
//Change a value is clonedMap
clonedMap.get(1).setName("test");
//Verify content of both maps
System.out.println(userMap);
System.out.println(clonedMap);
}
}
運(yùn)行結(jié)果:
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
Changes reflect in only one map
{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}
{1=User{name='test', age=26}, 2=User{name='fany', age=25}}
從運(yùn)行結(jié)果看出,對(duì)cloneMap修改,userMap沒有被改變,所以是深度復(fù)制。
總結(jié)
到此這篇關(guān)于java中Map集合的常用方法總結(jié)的文章就介紹到這了,更多相關(guān)java Map常用方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合EasyExcel進(jìn)行大數(shù)據(jù)處理的方法詳解
EasyExcel是一個(gè)基于Java的簡(jiǎn)單、省內(nèi)存的讀寫Excel的開源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel。本文將在SpringBoot中整合EasyExcel進(jìn)行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05
Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼,需要的朋友可以參考下2017-03-03
java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例
這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計(jì)sql執(zhí)行時(shí)間2014-03-03
Spring?Cloud?Loadbalancer服務(wù)均衡負(fù)載器詳解
這篇文章主要介紹了Spring?Cloud?Loadbalancer服務(wù)均衡負(fù)載器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean,IOC就是spring的核心思想之一——控制反轉(zhuǎn)。這里不再贅述,看此文章即可了解2023-04-04

