java中Map集合的常用方法總結大全
1、如何把一個Map轉化為List
日常開發(fā)中,我們經(jīng)常遇到這種場景,把一個Map轉化為List。map轉List有以下三種轉化方式:
把map的鍵key轉化為list
把map的值value轉化為list
把map的鍵值key-value轉化為list
示例代碼:
//語法 /** key 轉list List keyList = new ArrayList(map.keySet()); value轉list List valueList = new ArrayList(map.values()); //map轉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, "關羽"); userMap.put(4, "張飛"); userMap.put(5, "趙云"); userMap.put(6, "黃忠"); userMap.put(7, "馬超"); //把一個map的鍵轉化成list List<Integer>keyList=new ArrayList<>(userMap.keySet()); System.out.println(keyList); //把一個map的值轉化成list List<String> valueList = new ArrayList<>(userMap.values()); System.out.println(valueList); //把map的鍵值轉化成list List entryList=new ArrayList(userMap.entrySet()); System.out.println(entryList); } } ------------------------------------------------------------------------ // 結果: [1, 2, 3, 4, 5, 6, 7] [劉備, 諸葛亮, 關羽, 張飛, 趙云, 黃忠, 馬超] [1=劉備, 2=諸葛亮, 3=關羽, 4=張飛, 5=趙云, 6=黃忠, 7=馬超]
2、如何遍歷一個Map
我們經(jīng)常需要遍歷一個map,可以有以下兩種方式實現(xiàn):
通過entrySet+for實現(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, "關羽"); userMap.put(4, "張飛"); userMap.put(5, "趙云"); userMap.put(6, "黃忠"); userMap.put(7, "馬超"); //把一個map的鍵轉化成list List<Integer>keyList=new ArrayList<>(userMap.keySet()); // System.out.println(keyList); //把一個map的值轉化成list List<String> valueList = new ArrayList<>(userMap.values()); // System.out.println(valueList); //把map的鍵值轉化成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); } } } ----------------------------------------------- 結果: 1=劉備 2=諸葛亮 3=關羽 4=張飛 5=趙云 6=黃忠 7=馬超
通過Iterator+while實現(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, "關羽"); 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); } } } ------------------------------------------------------------ //結果: key:1,value:劉備 key:2,value:諸葛亮 key:3,value:關羽 key:4,value:張飛 key:5,value:趙云 key:6,value:黃忠 key:7,value:馬超
3、如何根據(jù)Map的keys進行排序
對Map的keys進行排序,在日常開發(fā)很常見,主要有以下兩種方式實現(xiàn)。
把Map.Entry放進list,再用Comparator對list進行排序
public class Test { public static void main(String[] args) { Map<String,String> userMap=new HashMap<>(); userMap.put("104", "諸葛亮"); userMap.put("106", "關羽"); 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()); } } } ------------------------------------------------ //結果: key:101,value:劉備 key:102,value:馬超 key:103,value:黃忠 key:104,value:諸葛亮 key:105,value:張飛 key:106,value:關羽 key:107,value:趙云
使用SortedMap+TreeMap+Comparator實現(xiàn)
public class Test { public static void main(String[] args) { Map<String,String> userMap=new HashMap<>(); userMap.put("104", "諸葛亮"); userMap.put("106", "關羽"); 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); } } } ---------------------------------------------- //結果: key:101,value:劉備 key:102,value:馬超 key:103,value:黃忠 key:104,value:諸葛亮 key:105,value:張飛 key:106,value:關羽 key:107,value:趙云
4、如何使用Map中的value進行排序
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的,運行結果如下: key:1,value:one key:2,value:two key:3,value:three ----------------------------------------------------------------------- //真正實現(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); } } } ---------------------------------------------------- //真正實現(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); } } ------------------------------------------------ //結果: 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"); 運行出錯 --------------------------------- //如果你希望你的空map可以添加元素的,可以這樣創(chuàng)建 Map map = new HashMap();
7、有關于map的復制
有關于hashmap的復制,在日常開發(fā)中,使用也比較多。主要有 =,clone,putAll,但是他們都是淺復制,使用的時候注意啦,可以看一下以下例子:
例子一,使用=復制一個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); } }
運行結果:
{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}}
從運行結果看出,對cloneMap修改,兩個map都改變了,所以=是淺復制。
例子二,使用hashmap的clone復制:
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); } }
運行結果:
{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}}
從運行結果看出,對cloneMap修改,兩個map都改變了,所以hashmap的clone也是淺復制。
例子三,通過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); } }
運行結果:
{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}}
從運行結果看出,對cloneMap修改,兩個map都改變了,所以putAll還是淺復制。
那么,如何實現(xiàn)深度復制呢?
可以使用序列化實現(xiàn),如下為谷歌Gson序列化HashMap,實現(xiàn)深度復制的例子:
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); } }
運行結果:
{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}}
從運行結果看出,對cloneMap修改,userMap沒有被改變,所以是深度復制。
總結
到此這篇關于java中Map集合的常用方法總結的文章就介紹到這了,更多相關java Map常用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot整合EasyExcel進行大數(shù)據(jù)處理的方法詳解
EasyExcel是一個基于Java的簡單、省內(nèi)存的讀寫Excel的開源項目。在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M的Excel。本文將在SpringBoot中整合EasyExcel進行大數(shù)據(jù)處理,感興趣的可以了解一下2022-05-05Mybatis 中的一對一,一對多,多對多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對一,一對多,多對多的配置原則示例代碼,需要的朋友可以參考下2017-03-03java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例
這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計sql執(zhí)行時間2014-03-03Spring?Cloud?Loadbalancer服務均衡負載器詳解
這篇文章主要介紹了Spring?Cloud?Loadbalancer服務均衡負載器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03springboot + mybatis配置多數(shù)據(jù)源示例
本篇文章主要介紹了springboot + mybatis配置多數(shù)據(jù)源示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03SpringBoot實現(xiàn)使用反射模擬IOC和getBean
這篇文章主要介紹了SpringBoot實現(xiàn)使用反射模擬IOC和getBean,IOC就是spring的核心思想之一——控制反轉。這里不再贅述,看此文章即可了解2023-04-04