欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中Map集合的常用方法總結大全

 更新時間:2024年01月18日 11:36:44   作者:sugarJava  
開發(fā)中最常用的就是List集合和Map集合,Map集合是基于java核心類java.util中的,下面這篇文章主要給大家總結介紹了關于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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論