溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java Map應該掌握的問題有哪些

發(fā)布時間:2021-12-31 15:59:22 來源:億速云 閱讀:172 作者:iii 欄目:編程語言

這篇文章主要介紹“Java Map應該掌握的問題有哪些”,在日常操作中,相信很多人在Java Map應該掌握的問題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java Map應該掌握的問題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、如何把一個Map轉化為List

日常開發(fā)中,我們經常遇到這種場景,把一個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());   // key-value list   List entryList = new ArrayList(map.entrySet());

示例代碼:

  public class Test {       public static void main(String[] args) {           Map<Integer, String> map = new HashMap<>();           map.put(2, "jay");           map.put(1, "whx");           map.put(3, "huaxiao");           //把一個map的鍵轉化為list           List<Integer> keyList = new ArrayList<>(map.keySet());           System.out.println(keyList);          //把map的值轉化為list          List<String> valueList = new ArrayList<>(map.values());          System.out.println(valueList);          把map的鍵值轉化為list          List entryList = new ArrayList(map.entrySet());          System.out.println(entryList);        }  }

運行結果:

  [1, 2, 3]   [whx, jay, huaxiao]   [1=whx, 2=jay, 3=huaxiao]

2、如何遍歷一個Map

我們經常需要遍歷一個map,可以有以下兩種方式實現(xiàn):

通過entrySet+for實現(xiàn)遍歷

  for(Entry entry: map.entrySet()) {     // get key     K key = entry.getKey();     // get value     V value = entry.getValue();   }

實例代碼:

  public class EntryMapTest {       public static void main(String[] args) {           Map<Integer, String> map = new HashMap<>();           map.put(2, "jay");           map.put(1, "whx");           map.put(3, "huaxiao");              for(Map.Entry entry: map.entrySet()) {               // get key              Integer key = (Integer) entry.getKey();              // get value              String value = (String) entry.getValue();                System.out.println("key:"+key+",value:"+value);          }      }  }

通過Iterator+while實現(xiàn)遍歷

  Iterator itr = map.entrySet().iterator();   while(itr.hasNext()) {     Entry entry = itr.next();     // get key     K key = entry.getKey();     // get value     V value = entry.getValue();   }

實例代碼:

  public class IteratorMapTest {       public static void main(String[] args) {           Map<Integer, String> map = new HashMap<>();           map.put(2, "jay");           map.put(1, "whx");           map.put(3, "huaxiao");              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);          }      }  }

運行結果:

  key:1,value:whx   key:2,value:jay   key:3,value:huaxiao

3、如何根據(jù)Map的keys進行排序

對Map的keys進行排序,在日常開發(fā)很常見,主要有以下兩種方式實現(xiàn)。

把Map.Entry放進list,再用Comparator對list進行排序

  List list = new ArrayList(map.entrySet());   Collections.sort(list, (Entry e1, Entry e2)-> {       return e1.getKey().compareTo(e2.getKey());   });

實例代碼:

  public class SortKeysMapTest {       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.getKey().toString().compareTo(e2.getKey().toString());          });            for (Map.Entry entry : list) {              System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());          }        }  }

使用SortedMap+TreeMap+Comparator實現(xiàn)

1.  SortedMap sortedMap = new TreeMap(new Comparator() { 2.    @Override 3.    public int compare(K k1, K k2) { 4.      return k1.compareTo(k2); 5.    } 6.  }); 7.  sortedMap.putAll(map);

實例代碼:

  public class SortKeys2MapTest {       public static void main(String[] args) {           Map<String, String> map = new HashMap<>();           map.put("2010", "jay");           map.put("1999", "whx");           map.put("3010", "huaxiao");              SortedMap sortedMap = new TreeMap(new Comparator<String>() {               @Override              public int compare(String k1, String k2) {                  return k1.compareTo(k2);              }          });          sortedMap.putAll(map);            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:1999,value:whx   key:2010,value:jay   key:3010,value:huaxiao

4、如何對Map的values進行排序

  List list = new ArrayList(map.entrySet());   Collections.sort(list, (Entry e1, Entry e2) ->{       return e1.getValue().compareTo(e2.getValue());     });

實例代碼:

  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());          }      }  }

運行結果:

  key:3010,value:huaxiao   key:2010,value:jay   key:1999,value:whx

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);          }      }    }

運行結果如下:

Java Map應該掌握的問題有哪些

可以發(fā)現(xiàn),繼續(xù)往map添加元素是會報錯的,實現(xiàn)真正不可變的map。

6、HashMap, TreeMap, and Hashtable,ConcurrentHashMap的區(qū)別

Java Map應該掌握的問題有哪些

7、如何創(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();

8、有關于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 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應該掌握的問題有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI