java中Map集合的常用方法總結(jié)大全
1、如何把一個Map轉(zhuǎn)化為List
日常開發(fā)中,我們經(jīng)常遇到這種場景,把一個Map轉(zhuǎn)化為List。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, "馬超");
//把一個map的鍵轉(zhuǎn)化成list
List<Integer>keyList=new ArrayList<>(userMap.keySet());
System.out.println(keyList);
//把一個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、如何遍歷一個Map
我們經(jīng)常需要遍歷一個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, "馬超");
//把一個map的鍵轉(zhuǎn)化成list
List<Integer>keyList=new ArrayList<>(userMap.keySet());
// System.out.println(keyList);
//把一個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)行排序
對Map的keys進(jìn)行排序,在日常開發(fā)很常見,主要有以下兩種方式實(shí)現(xiàn)。
把Map.Entry放進(jìn)list,再用Comparator對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、如何初始化一個靜態(tài)/不可變的Map
//初始化一個靜態(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)一個靜態(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)一個靜態(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報錯6、如何創(chuàng)建一個空map
如果map是不可變的,可以這樣創(chuàng)建:
Map map=Collections.emptyMap();
or
Map<String,String> map=Collections.<String, String>emptyMap();
//map1.put("1", "1"); 運(yùn)行出錯
---------------------------------
//如果你希望你的空map可以添加元素的,可以這樣創(chuàng)建
Map map = new HashMap();7、有關(guān)于map的復(fù)制
有關(guān)于hashmap的復(fù)制,在日常開發(fā)中,使用也比較多。主要有 =,clone,putAll,但是他們都是淺復(fù)制,使用的時候注意啦,可以看一下以下例子:
例子一,使用=復(fù)制一個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é)果看出,對cloneMap修改,兩個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é)果看出,對cloneMap修改,兩個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é)果看出,對cloneMap修改,兩個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é)果看出,對cloneMap修改,userMap沒有被改變,所以是深度復(fù)制。
總結(jié)
到此這篇關(guān)于java中Map集合的常用方法總結(jié)的文章就介紹到這了,更多相關(guān)java Map常用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)支付功能附源碼
這篇文章主要介紹了SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)功能支付附源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
詳解spring cloud如何使用spring-test進(jìn)行單元測試
這篇文章主要介紹了spring cloud如何使用spring-test進(jìn)行單元測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例
這篇文章主要介紹了java Unicode和UTF-8之間轉(zhuǎn)換實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Intellj?idea新建的java源文件夾不是藍(lán)色的圖文解決辦法
idea打開java項(xiàng)目后新建的模塊中,java文件夾需要變成藍(lán)色,這篇文章主要給大家介紹了關(guān)于Intellj?idea新建的java源文件夾不是藍(lán)色的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
Spring中獲取HttpServletRequest的三種方式小結(jié)
spring框架web環(huán)境中,獲取HttpServletRequest是常見的操作,本文將為大家詳細(xì)介紹一下Spring中獲取HttpServletRequest的三種方式,有需要的小伙伴可以了解下2026-04-04
SpringCloud Feign參數(shù)問題及解決方法
這篇文章主要介紹了SpringCloud Feign參數(shù)問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

