java中Map集合的常用方法總結(jié)大全
1、如何把一個(gè)Map轉(zhuǎn)化為L(zhǎng)ist
日常開(kāi)發(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
示例代碼:
//語(yǔ)法 /** 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):
通過(guò)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=馬超
通過(guò)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)行排序,在日常開(kāi)發(fā)很常見(jiàn),主要有以下兩種方式實(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ù)制,在日常開(kāi)發(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ù)制。
例子三,通過(guò)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沒(méi)有被改變,所以是深度復(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)存的讀寫(xiě)Excel的開(kāi)源項(xiàng)目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫(xiě)百M(fèi)的Excel。本文將在SpringBoot中整合EasyExcel進(jìn)行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼,需要的朋友可以參考下2017-03-03java利用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-03Spring?Cloud?Loadbalancer服務(wù)均衡負(fù)載器詳解
這篇文章主要介紹了Spring?Cloud?Loadbalancer服務(wù)均衡負(fù)載器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean,IOC就是spring的核心思想之一——控制反轉(zhuǎn)。這里不再贅述,看此文章即可了解2023-04-04