关于Java Map应该掌握的问题

Posted zifei399

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java Map应该掌握的问题相关的知识,希望对你有一定的参考价值。

    1. 如何把一个Map转化为List

      日常开发中,我们经常遇到这种场景,把一个Map转化为List。map转List有以下三种转化方式:

      • 把map的键key转化为list
      • 把map的值value转化为list
      • 把map的键值key-value转化为list

        伪代码如下:

      [plain] view plaincopy
       
      1. // key list  
      2. List  
      3. keyList  
      4. =  
      5.   
      6. new  
      7.   
      8. ArrayList  
      9. (  
      10. map  
      11. .  
      12. keySet  
      13. ());  
      14. // value list  
      15. List  
      16. valueList  
      17. =  
      18.   
      19. new  
      20.   
      21. ArrayList  
      22. (  
      23. map  
      24. .  
      25. values  
      26. ());  
      27. // key-value list  
      28. List  
      29. entryList  
      30. =  
      31.   
      32. new  
      33.   
      34. ArrayList  
      35. (  
      36. map  
      37. .  
      38. entrySet  
      39. ());  

      示例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. Test  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. 2  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. 1  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. 3  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. //把一个map的键转化为list  
      66.   
      67. List  
      68. <  
      69. Integer  
      70. >  
      71. keyList  
      72. =  
      73.   
      74. new  
      75.   
      76. ArrayList  
      77. <>(  
      78. map  
      79. .  
      80. keySet  
      81. ());  
      82.   
      83. System  
      84. .  
      85. out  
      86. .  
      87. println  
      88. (  
      89. keyList  
      90. );  
      91.   
      92. //把map的值转化为list  
      93.   
      94. List  
      95. <  
      96. String  
      97. >  
      98. valueList  
      99. =  
      100.   
      101. new  
      102.   
      103. ArrayList  
      104. <>(  
      105. map  
      106. .  
      107. values  
      108. ());  
      109.   
      110. System  
      111. .  
      112. out  
      113. .  
      114. println  
      115. (  
      116. valueList  
      117. );  
      118.   
      119. 把  
      120. map  
      121. 的键值转化为  
      122. list  
      123.   
      124. List  
      125. entryList  
      126. =  
      127.   
      128. new  
      129.   
      130. ArrayList  
      131. (  
      132. map  
      133. .  
      134. entrySet  
      135. ());  
      136.   
      137. System  
      138. .  
      139. out  
      140. .  
      141. println  
      142. (  
      143. entryList  
      144. );  
      145.   
      146. }  
      147. }  

      运行结果:

      [plain] view plaincopy
       
      1. [  
      2. 1  
      3. ,  
      4.   
      5. 2  
      6. ,  
      7.   
      8. 3  
      9. ]  
      10. [  
      11. whx  
      12. ,  
      13. jay  
      14. ,  
      15. huaxiao  
      16. ]  
      17. [  
      18. 1  
      19. =  
      20. whx  
      21. ,  
      22.   
      23. 2  
      24. =  
      25. jay  
      26. ,  
      27.   
      28. 3  
      29. =  
      30. huaxiao  
      31. ]  

      2、如何遍历一个Map

      我们经常需要遍历一个map,可以有以下两种方式实现:

      通过entrySet+for实现遍历

      [plain] view plaincopy
       
      1. for  
      2. (  
      3. Entry  
      4. entry  
      5. :  
      6. map  
      7. .  
      8. entrySet  
      9. ())  
      10.   
      11. {  
      12.   
      13. // get key  
      14. K key  
      15. =  
      16. entry  
      17. .  
      18. getKey  
      19. ();  
      20.   
      21. // get value  
      22. V value  
      23. =  
      24. entry  
      25. .  
      26. getValue  
      27. ();  
      28. }  

      实例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. EntryMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. 2  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. 1  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. 3  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. for  
      66. (  
      67. Map  
      68. .  
      69. Entry  
      70. entry  
      71. :  
      72. map  
      73. .  
      74. entrySet  
      75. ())  
      76.   
      77. {  
      78.   
      79. // get key  
      80.   
      81. Integer  
      82. key  
      83. =  
      84.   
      85. (  
      86. Integer  
      87. )  
      88. entry  
      89. .  
      90. getKey  
      91. ();  
      92.   
      93. // get value  
      94.   
      95. String  
      96. value  
      97. =  
      98.   
      99. (  
      100. String  
      101. )  
      102. entry  
      103. .  
      104. getValue  
      105. ();  
      106.   
      107. System  
      108. .  
      109. out  
      110. .  
      111. println  
      112. (  
      113. "key:"  
      114. +  
      115. key  
      116. +  
      117. ",value:"  
      118. +  
      119. value  
      120. );  
      121.   
      122. }  
      123.   
      124. }  
      125. }  

      通过Iterator+while实现遍历

      [plain] view plaincopy
       
      1. Iterator  
      2. itr  
      3. =  
      4. map  
      5. .  
      6. entrySet  
      7. ().  
      8. iterator  
      9. ();  
      10. while  
      11. (  
      12. itr  
      13. .  
      14. hasNext  
      15. ())  
      16.   
      17. {  
      18.   
      19. Entry  
      20. entry  
      21. =  
      22. itr  
      23. .  
      24. next  
      25. ();  
      26.   
      27. // get key  
      28. K key  
      29. =  
      30. entry  
      31. .  
      32. getKey  
      33. ();  
      34.   
      35. // get value  
      36. V value  
      37. =  
      38. entry  
      39. .  
      40. getValue  
      41. ();  
      42. }  

      实例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. IteratorMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. 2  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. 1  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. 3  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. Iterator  
      66. itr  
      67. =  
      68. map  
      69. .  
      70. entrySet  
      71. ().  
      72. iterator  
      73. ();  
      74.   
      75. while  
      76. (  
      77. itr  
      78. .  
      79. hasNext  
      80. ())  
      81.   
      82. {  
      83.   
      84. Map  
      85. .  
      86. Entry  
      87. entry  
      88. =  
      89.   
      90. (  
      91. Map  
      92. .  
      93. Entry  
      94. )  
      95. itr  
      96. .  
      97. next  
      98. ();  
      99.   
      100. // get key  
      101.   
      102. Integer  
      103. key  
      104. =  
      105.   
      106. (  
      107. Integer  
      108. )  
      109. entry  
      110. .  
      111. getKey  
      112. ();  
      113.   
      114. // get value  
      115.   
      116. String  
      117. value  
      118. =  
      119.   
      120. (  
      121. String  
      122. )  
      123. entry  
      124. .  
      125. getValue  
      126. ();  
      127.   
      128. System  
      129. .  
      130. out  
      131. .  
      132. println  
      133. (  
      134. "key:"  
      135. +  
      136. key  
      137. +  
      138. ",value:"  
      139. +  
      140. value  
      141. );  
      142.   
      143. }  
      144.   
      145. }  
      146. }  

      运行结果:

      [plain] view plaincopy
       
      1. key  
      2. :  
      3. 1  
      4. ,  
      5. value  
      6. :  
      7. whx  
      8. key  
      9. :  
      10. 2  
      11. ,  
      12. value  
      13. :  
      14. jay  
      15. key  
      16. :  
      17. 3  
      18. ,  
      19. value  
      20. :  
      21. huaxiao  

      3、如何根据Map的keys进行排序

      对Map的keys进行排序,在日常开发很常见,主要有以下两种方式实现。

      把Map.Entry放进list,再用Comparator对list进行排序

      [plain] view plaincopy
       
      1. List  
      2. list  
      3. =  
      4.   
      5. new  
      6.   
      7. ArrayList  
      8. (  
      9. map  
      10. .  
      11. entrySet  
      12. ());  
      13. Collections  
      14. .  
      15. sort  
      16. (  
      17. list  
      18. ,  
      19.   
      20. (  
      21. Entry  
      22. e1  
      23. ,  
      24.   
      25. Entry  
      26. e2  
      27. )->  
      28.   
      29. {  
      30.   
      31. return  
      32. e1  
      33. .  
      34. getKey  
      35. ().  
      36. compareTo  
      37. (  
      38. e2  
      39. .  
      40. getKey  
      41. ());  
      42. });  

      实例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. SortKeysMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. String  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. "2010"  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. "1999"  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. "3010"  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. List  
      66. <  
      67. Map  
      68. .  
      69. Entry  
      70. <  
      71. String  
      72. ,  
      73. String  
      74. >>  
      75. list  
      76. =  
      77.   
      78. new  
      79.   
      80. ArrayList  
      81. <>(  
      82. map  
      83. .  
      84. entrySet  
      85. ());  
      86.   
      87. Collections  
      88. .  
      89. sort  
      90. (  
      91. list  
      92. ,  
      93.   
      94. (  
      95. Map  
      96. .  
      97. Entry  
      98. e1  
      99. ,  
      100.   
      101. Map  
      102. .  
      103. Entry  
      104. e2  
      105. )->  
      106.   
      107. {  
      108.   
      109. return  
      110. e1  
      111. .  
      112. getKey  
      113. ().  
      114. toString  
      115. ().  
      116. compareTo  
      117. (  
      118. e2  
      119. .  
      120. getKey  
      121. ().  
      122. toString  
      123. ());  
      124.   
      125. });  
      126.   
      127. for  
      128.   
      129. (  
      130. Map  
      131. .  
      132. Entry  
      133. entry  
      134. :  
      135. list  
      136. )  
      137.   
      138. {  
      139.   
      140. System  
      141. .  
      142. out  
      143. .  
      144. println  
      145. (  
      146. "key:"  
      147.   
      148. +  
      149. entry  
      150. .  
      151. getKey  
      152. ()  
      153.   
      154. +  
      155.   
      156. ",value:"  
      157.   
      158. +  
      159. entry  
      160. .  
      161. getValue  
      162. ());  
      163.   
      164. }  
      165.   
      166. }  
      167. }  

      使用SortedMap+TreeMap+Comparator实现

      [plain] view plaincopy
       
      1. SortedMap  
      2. sortedMap  
      3. =  
      4.   
      5. new  
      6.   
      7. TreeMap  
      8. (  
      9. new  
      10.   
      11. Comparator  
      12. ()  
      13.   
      14. {  
      15.   
      16. @Override  
      17.   
      18. public  
      19.   
      20. int  
      21. compare  
      22. (  
      23. K k1  
      24. ,  
      25. K k2  
      26. )  
      27.   
      28. {  
      29.   
      30. return  
      31. k1  
      32. .  
      33. compareTo  
      34. (  
      35. k2  
      36. );  
      37.   
      38. }  
      39. });  
      40. sortedMap  
      41. .  
      42. putAll  
      43. (  
      44. map  
      45. );  

      实例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. SortKeys2MapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. String  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. "2010"  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. "1999"  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. "3010"  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. SortedMap  
      66. sortedMap  
      67. =  
      68.   
      69. new  
      70.   
      71. TreeMap  
      72. (  
      73. new  
      74.   
      75. Comparator  
      76. <  
      77. String  
      78. >()  
      79.   
      80. {  
      81.   
      82. @Override  
      83.   
      84. public  
      85.   
      86. int  
      87. compare  
      88. (  
      89. String  
      90. k1  
      91. ,  
      92.   
      93. String  
      94. k2  
      95. )  
      96.   
      97. {  
      98.   
      99. return  
      100. k1  
      101. .  
      102. compareTo  
      103. (  
      104. k2  
      105. );  
      106.   
      107. }  
      108.   
      109. });  
      110. sortedMap  
      111. .  
      112. putAll  
      113. (  
      114. map  
      115. );  
      116.   
      117. Iterator  
      118. itr  
      119. =  
      120. sortedMap  
      121. .  
      122. entrySet  
      123. ().  
      124. iterator  
      125. ();  
      126.   
      127. while  
      128. (  
      129. itr  
      130. .  
      131. hasNext  
      132. ())  
      133.   
      134. {  
      135.   
      136. Map  
      137. .  
      138. Entry  
      139. entry  
      140. =  
      141.   
      142. (  
      143. Map  
      144. .  
      145. Entry  
      146. )  
      147. itr  
      148. .  
      149. next  
      150. ();  
      151.   
      152. // get key  
      153.   
      154. String  
      155. key  
      156. =  
      157.   
      158. (  
      159. String  
      160. )  
      161. entry  
      162. .  
      163. getKey  
      164. ();  
      165.   
      166. // get value  
      167.   
      168. String  
      169. value  
      170. =  
      171.   
      172. (  
      173. String  
      174. )  
      175. entry  
      176. .  
      177. getValue  
      178. ();  
      179.   
      180. System  
      181. .  
      182. out  
      183. .  
      184. println  
      185. (  
      186. "key:"  
      187. +  
      188. key  
      189. +  
      190. ",value:"  
      191. +  
      192. value  
      193. );  
      194.   
      195. }  
      196.   
      197. }  
      198. }  

      运行结果:

      [plain] view plaincopy
       
      1. key  
      2. :  
      3. 1999  
      4. ,  
      5. value  
      6. :  
      7. whx  
      8. key  
      9. :  
      10. 2010  
      11. ,  
      12. value  
      13. :  
      14. jay  
      15. key  
      16. :  
      17. 3010  
      18. ,  
      19. value  
      20. :  
      21. huaxiao  

      4、如何对Map的values进行排序

      [plain] view plaincopy
       
      1. List  
      2. list  
      3. =  
      4.   
      5. new  
      6.   
      7. ArrayList  
      8. (  
      9. map  
      10. .  
      11. entrySet  
      12. ());  
      13. Collections  
      14. .  
      15. sort  
      16. (  
      17. list  
      18. ,  
      19.   
      20. (  
      21. Entry  
      22. e1  
      23. ,  
      24.   
      25. Entry  
      26. e2  
      27. )  
      28.   
      29. ->{  
      30.   
      31. return  
      32. e1  
      33. .  
      34. getValue  
      35. ().  
      36. compareTo  
      37. (  
      38. e2  
      39. .  
      40. getValue  
      41. ());  
      42.   
      43. });  

      实例代码:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. SortValuesMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. String  
      26. ,  
      27.   
      28. String  
      29. >  
      30. map  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37. map  
      38. .  
      39. put  
      40. (  
      41. "2010"  
      42. ,  
      43.   
      44. "jay"  
      45. );  
      46. map  
      47. .  
      48. put  
      49. (  
      50. "1999"  
      51. ,  
      52.   
      53. "whx"  
      54. );  
      55. map  
      56. .  
      57. put  
      58. (  
      59. "3010"  
      60. ,  
      61.   
      62. "huaxiao"  
      63. );  
      64.   
      65. List  
      66.   
      67. <  
      68. Map  
      69. .  
      70. Entry  
      71. <  
      72. String  
      73. ,  
      74. String  
      75. >>  
      76. list  
      77. =  
      78.   
      79. new  
      80.   
      81. ArrayList  
      82. <>(  
      83. map  
      84. .  
      85. entrySet  
      86. ());  
      87.   
      88. Collections  
      89. .  
      90. sort  
      91. (  
      92. list  
      93. ,  
      94.   
      95. (  
      96. Map  
      97. .  
      98. Entry  
      99. e1  
      100. ,  
      101.   
      102. Map  
      103. .  
      104. Entry  
      105. e2  
      106. )->  
      107.   
      108. {  
      109.   
      110. return  
      111. e1  
      112. .  
      113. getValue  
      114. ().  
      115. toString  
      116. ().  
      117. compareTo  
      118. (  
      119. e2  
      120. .  
      121. getValue  
      122. ().  
      123. toString  
      124. ());  
      125.   
      126. }  
      127.   
      128. );  
      129.   
      130. for  
      131.   
      132. (  
      133. Map  
      134. .  
      135. Entry  
      136. entry  
      137. :  
      138. list  
      139. )  
      140.   
      141. {  
      142.   
      143. System  
      144. .  
      145. out  
      146. .  
      147. println  
      148. (  
      149. "key:"  
      150.   
      151. +  
      152. entry  
      153. .  
      154. getKey  
      155. ()  
      156.   
      157. +  
      158.   
      159. ",value:"  
      160.   
      161. +  
      162. entry  
      163. .  
      164. getValue  
      165. ());  
      166.   
      167. }  
      168.   
      169. }  
      170. }  

      运行结果:

      [plain] view plaincopy
       
      1. key  
      2. :  
      3. 3010  
      4. ,  
      5. value  
      6. :  
      7. huaxiao  
      8. key  
      9. :  
      10. 2010  
      11. ,  
      12. value  
      13. :  
      14. jay  
      15. key  
      16. :  
      17. 1999  
      18. ,  
      19. value  
      20. :  
      21. whx  

      5、如何初始化一个静态/不可变的Map

      初始化一个静态不可变的map,单单static final+static代码块还是不行的,如下:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. Test1  
      6.   
      7. {  
      8.   
      9. private  
      10.   
      11. static  
      12.   
      13. final  
      14.   
      15. Map  
      16.   
      17. <  
      18. Integer  
      19. ,  
      20. String  
      21. >  
      22. map  
      23. ;  
      24.   
      25. static  
      26.   
      27. {  
      28. map  
      29. =  
      30.   
      31. new  
      32.   
      33. HashMap  
      34. <  
      35. Integer  
      36. ,  
      37.   
      38. String  
      39. >();  
      40. map  
      41. .  
      42. put  
      43. (  
      44. 1  
      45. ,  
      46.   
      47. "one"  
      48. );  
      49. map  
      50. .  
      51. put  
      52. (  
      53. 2  
      54. ,  
      55.   
      56. "two"  
      57. );  
      58.   
      59. }  
      60.   
      61. public  
      62.   
      63. static  
      64.   
      65. void  
      66. main  
      67. (  
      68. String  
      69. []  
      70. args  
      71. )  
      72.   
      73. {  
      74. map  
      75. .  
      76. put  
      77. (  
      78. 3  
      79. ,  
      80.   
      81. "three"  
      82. );  
      83.   
      84. Iterator  
      85. itr  
      86. =  
      87. map  
      88. .  
      89. entrySet  
      90. ().  
      91. iterator  
      92. ();  
      93.   
      94. while  
      95. (  
      96. itr  
      97. .  
      98. hasNext  
      99. ())  
      100.   
      101. {  
      102.   
      103. Map  
      104. .  
      105. Entry  
      106. entry  
      107. =  
      108.   
      109. (  
      110. Map  
      111. .  
      112. Entry  
      113. )  
      114. itr  
      115. .  
      116. next  
      117. ();  
      118.   
      119. // get key  
      120.   
      121. Integer  
      122. key  
      123. =  
      124.   
      125. (  
      126. Integer  
      127. )  
      128. entry  
      129. .  
      130. getKey  
      131. ();  
      132.   
      133. // get value  
      134.   
      135. String  
      136. value  
      137. =  
      138.   
      139. (  
      140. String  
      141. )  
      142. entry  
      143. .  
      144. getValue  
      145. ();  
      146.   
      147. System  
      148. .  
      149. out  
      150. .  
      151. println  
      152. (  
      153. "key:"  
      154. +  
      155. key  
      156. +  
      157. ",value:"  
      158. +  
      159. value  
      160. );  
      161.   
      162. }  
      163.   
      164. }  
      165. }  

      这里面,map继续添加元素(3,"three"),发现是OK的,运行结果如下:

      [plain] view plaincopy
       
      1. key  
      2. :  
      3. 1  
      4. ,  
      5. value  
      6. :  
      7. one  
      8. key  
      9. :  
      10. 2  
      11. ,  
      12. value  
      13. :  
      14. two  
      15. key  
      16. :  
      17. 3  
      18. ,  
      19. value  
      20. :  
      21. three  

      真正实现一个静态不可变的map,需要Collections.unmodifiableMap,代码如下:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. Test2  
      6.   
      7. {  
      8.   
      9. private  
      10.   
      11. static  
      12.   
      13. final  
      14.   
      15. Map  
      16. <  
      17. Integer  
      18. ,  
      19.   
      20. String  
      21. >  
      22. map  
      23. ;  
      24.   
      25. static  
      26.   
      27. {  
      28.   
      29. Map  
      30. <  
      31. Integer  
      32. ,  
      33. String  
      34. >  
      35. aMap  
      36. =  
      37.   
      38. new  
      39.   
      40. HashMap  
      41. <>();  
      42. aMap  
      43. .  
      44. put  
      45. (  
      46. 1  
      47. ,  
      48.   
      49. "one"  
      50. );  
      51. aMap  
      52. .  
      53. put  
      54. (  
      55. 2  
      56. ,  
      57.   
      58. "two"  
      59. );  
      60. map  
      61. =  
      62.   
      63. Collections  
      64. .  
      65. unmodifiableMap  
      66. (  
      67. aMap  
      68. );  
      69.   
      70. }  
      71.   
      72. public  
      73.   
      74. static  
      75.   
      76. void  
      77. main  
      78. (  
      79. String  
      80. []  
      81. args  
      82. )  
      83.   
      84. {  
      85. map  
      86. .  
      87. put  
      88. (  
      89. 3  
      90. ,  
      91.   
      92. "3"  
      93. );  
      94.   
      95. Iterator  
      96. itr  
      97. =  
      98. map  
      99. .  
      100. entrySet  
      101. ().  
      102. iterator  
      103. ();  
      104.   
      105. while  
      106. (  
      107. itr  
      108. .  
      109. hasNext  
      110. ())  
      111.   
      112. {  
      113.   
      114. Map  
      115. .  
      116. Entry  
      117. entry  
      118. =  
      119.   
      120. (  
      121. Map  
      122. .  
      123. Entry  
      124. )  
      125. itr  
      126. .  
      127. next  
      128. ();  
      129.   
      130. // get key  
      131.   
      132. Integer  
      133. key  
      134. =  
      135.   
      136. (  
      137. Integer  
      138. )  
      139. entry  
      140. .  
      141. getKey  
      142. ();  
      143.   
      144. // get value  
      145.   
      146. String  
      147. value  
      148. =  
      149.   
      150. (  
      151. String  
      152. )  
      153. entry  
      154. .  
      155. getValue  
      156. ();  
      157.   
      158. System  
      159. .  
      160. out  
      161. .  
      162. println  
      163. (  
      164. "key:"  
      165. +  
      166. key  
      167. +  
      168. ",value:"  
      169. +  
      170. value  
      171. );  
      172.   
      173. }  
      174.   
      175. }  
      176.   
      177. }  

      运行结果如下:
      技术图片

      可以发现,继续往map添加元素是会报错的,实现真正不可变的map。

      6、HashMap, TreeMap, and Hashtable,ConcurrentHashMap的区别

      HashMap TreeMap Hashtable ConcurrentHashMap
      有序性 否 是 否 否
      null k-v 是-是 否-是 否-否 否-否
      线性安全 否 否 是 是
      时间复杂度 O(1) O(log n) O(1) O(log n)
      底层结构 数组+链表 红黑树 数组+链表 红黑树

      7、如何创建一个空map

      如果map是不可变的,可以这样创建:

      [plain] view plaincopy
       
      1. Map  
      2. map  
      3. =  
      4. Collections  
      5. .  
      6. emptyMap  
      7. ();  
      8. or  
      9. Map  
      10. <  
      11. String  
      12. ,  
      13. String  
      14. >  
      15. map  
      16. =  
      17. Collections  
      18. .<  
      19. String  
      20. ,  
      21.   
      22. String  
      23. >  
      24. emptyMap  
      25. ();  
      26. //map1.put("1", "1"); 运行出错  

      如果你希望你的空map可以添加元素的,可以这样创建

      [plain] view plaincopy
       
      1. Map  
      2. map  
      3. =  
      4.   
      5. new  
      6.   
      7. HashMap  
      8. ();  

      8、有关于map的复制

      有关于hashmap的复制,在日常开发中,使用也比较多。主要有 =,clone,putAll,但是他们都是浅复制,使用的时候注意啦,可以看一下以下例子:

      例子一,使用=复制一个map:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. CopyMapAssignTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. Map  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. User  
      29. >  
      30. userMap  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37.   
      38. userMap  
      39. .  
      40. put  
      41. (  
      42. 1  
      43. ,  
      44.   
      45. new  
      46.   
      47. User  
      48. (  
      49. "jay"  
      50. ,  
      51.   
      52. 26  
      53. ));  
      54. userMap  
      55. .  
      56. put  
      57. (  
      58. 2  
      59. ,  
      60.   
      61. new  
      62.   
      63. User  
      64. (  
      65. "fany"  
      66. ,  
      67.   
      68. 25  
      69. ));  
      70.   
      71. //Shallow clone  
      72.   
      73. Map  
      74. <  
      75. Integer  
      76. ,  
      77.   
      78. User  
      79. >  
      80. clonedMap  
      81. =  
      82. userMap  
      83. ;  
      84.   
      85. //Same as userMap  
      86.   
      87. System  
      88. .  
      89. out  
      90. .  
      91. println  
      92. (  
      93. clonedMap  
      94. );  
      95.   
      96. System  
      97. .  
      98. out  
      99. .  
      100. println  
      101. (  
      102. " Changes reflect in both maps  "  
      103. );  
      104.   
      105. //Change a value is clonedMap  
      106. clonedMap  
      107. .  
      108. get  
      109. (  
      110. 1  
      111. ).  
      112. setName  
      113. (  
      114. "test"  
      115. );  
      116.   
      117. //Verify content of both maps  
      118.   
      119. System  
      120. .  
      121. out  
      122. .  
      123. println  
      124. (  
      125. userMap  
      126. );  
      127.   
      128. System  
      129. .  
      130. out  
      131. .  
      132. println  
      133. (  
      134. clonedMap  
      135. );  
      136.   
      137. }  
      138. }  

      运行结果:

      [plain] view plaincopy
       
      1. {  
      2. 1  
      3. =  
      4. User  
      5. {  
      6. name  
      7. =  
      8. ‘jay‘  
      9. ,  
      10. age  
      11. =  
      12. 26  
      13. },  
      14.   
      15. 2  
      16. =  
      17. User  
      18. {  
      19. name  
      20. =  
      21. ‘fany‘  
      22. ,  
      23. age  
      24. =  
      25. 25  
      26. }}  
      27.   
      28. Changes  
      29. reflect  
      30. in  
      31. both maps  
      32.   
      33. {  
      34. 1  
      35. =  
      36. User  
      37. {  
      38. name  
      39. =  
      40. ‘test‘  
      41. ,  
      42. age  
      43. =  
      44. 26  
      45. },  
      46.   
      47. 2  
      48. =  
      49. User  
      50. {  
      51. name  
      52. =  
      53. ‘fany‘  
      54. ,  
      55. age  
      56. =  
      57. 25  
      58. }}  
      59. {  
      60. 1  
      61. =  
      62. User  
      63. {  
      64. name  
      65. =  
      66. ‘test‘  
      67. ,  
      68. age  
      69. =  
      70. 26  
      71. },  
      72.   
      73. 2  
      74. =  
      75. User  
      76. {  
      77. name  
      78. =  
      79. ‘fany‘  
      80. ,  
      81. age  
      82. =  
      83. 25  
      84. }}  

      从运行结果看出,对cloneMap修改,两个map都改变了,所以=是浅复制。

      例子二,使用hashmap的clone复制:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. CopyCloneMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. HashMap  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. User  
      29. >  
      30. userMap  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37.   
      38. userMap  
      39. .  
      40. put  
      41. (  
      42. 1  
      43. ,  
      44.   
      45. new  
      46.   
      47. User  
      48. (  
      49. "jay"  
      50. ,  
      51.   
      52. 26  
      53. ));  
      54. userMap  
      55. .  
      56. put  
      57. (  
      58. 2  
      59. ,  
      60.   
      61. new  
      62.   
      63. User  
      64. (  
      65. "fany"  
      66. ,  
      67.   
      68. 25  
      69. ));  
      70.   
      71. //Shallow clone  
      72.   
      73. HashMap  
      74. <  
      75. Integer  
      76. ,  
      77.   
      78. User  
      79. >  
      80. clonedMap  
      81. =  
      82.   
      83. (  
      84. HashMap  
      85. <  
      86. Integer  
      87. ,  
      88.   
      89. User  
      90. >)  
      91. userMap  
      92. .  
      93. clone  
      94. ();  
      95.   
      96. //Same as userMap  
      97.   
      98. System  
      99. .  
      100. out  
      101. .  
      102. println  
      103. (  
      104. clonedMap  
      105. );  
      106.   
      107. System  
      108. .  
      109. out  
      110. .  
      111. println  
      112. (  
      113. " Changes reflect in both maps  "  
      114. );  
      115.   
      116. //Change a value is clonedMap  
      117. clonedMap  
      118. .  
      119. get  
      120. (  
      121. 1  
      122. ).  
      123. setName  
      124. (  
      125. "test"  
      126. );  
      127.   
      128. //Verify content of both maps  
      129.   
      130. System  
      131. .  
      132. out  
      133. .  
      134. println  
      135. (  
      136. userMap  
      137. );  
      138.   
      139. System  
      140. .  
      141. out  
      142. .  
      143. println  
      144. (  
      145. clonedMap  
      146. );  
      147.   
      148. }  
      149. }  

      运行结果:

      [plain] view plaincopy
       
      1. {  
      2. 1  
      3. =  
      4. User  
      5. {  
      6. name  
      7. =  
      8. ‘jay‘  
      9. ,  
      10. age  
      11. =  
      12. 26  
      13. },  
      14.   
      15. 2  
      16. =  
      17. User  
      18. {  
      19. name  
      20. =  
      21. ‘fany‘  
      22. ,  
      23. age  
      24. =  
      25. 25  
      26. }}  
      27.   
      28. Changes  
      29. reflect  
      30. in  
      31. both maps  
      32.   
      33. {  
      34. 1  
      35. =  
      36. User  
      37. {  
      38. name  
      39. =  
      40. ‘test‘  
      41. ,  
      42. age  
      43. =  
      44. 26  
      45. },  
      46.   
      47. 2  
      48. =  
      49. User  
      50. {  
      51. name  
      52. =  
      53. ‘fany‘  
      54. ,  
      55. age  
      56. =  
      57. 25  
      58. }}  
      59. {  
      60. 1  
      61. =  
      62. User  
      63. {  
      64. name  
      65. =  
      66. ‘test‘  
      67. ,  
      68. age  
      69. =  
      70. 26  
      71. },  
      72.   
      73. 2  
      74. =  
      75. User  
      76. {  
      77. name  
      78. =  
      79. ‘fany‘  
      80. ,  
      81. age  
      82. =  
      83. 25  
      84. }}  

      从运行结果看出,对cloneMap修改,两个map都改变了,所以hashmap的clone也是浅复制。

      例子三,通过putAll操作

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. CopyPutAllMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. HashMap  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. User  
      29. >  
      30. userMap  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37.   
      38. userMap  
      39. .  
      40. put  
      41. (  
      42. 1  
      43. ,  
      44.   
      45. new  
      46.   
      47. User  
      48. (  
      49. "jay"  
      50. ,  
      51.   
      52. 26  
      53. ));  
      54. userMap  
      55. .  
      56. put  
      57. (  
      58. 2  
      59. ,  
      60.   
      61. new  
      62.   
      63. User  
      64. (  
      65. "fany"  
      66. ,  
      67.   
      68. 25  
      69. ));  
      70.   
      71. //Shallow clone  
      72.   
      73. HashMap  
      74. <  
      75. Integer  
      76. ,  
      77.   
      78. User  
      79. >  
      80. clonedMap  
      81. =  
      82.   
      83. new  
      84.   
      85. HashMap  
      86. <>();  
      87. clonedMap  
      88. .  
      89. putAll  
      90. (  
      91. userMap  
      92. );  
      93.   
      94. //Same as userMap  
      95.   
      96. System  
      97. .  
      98. out  
      99. .  
      100. println  
      101. (  
      102. clonedMap  
      103. );  
      104.   
      105. System  
      106. .  
      107. out  
      108. .  
      109. println  
      110. (  
      111. " Changes reflect in both maps  "  
      112. );  
      113.   
      114. //Change a value is clonedMap  
      115. clonedMap  
      116. .  
      117. get  
      118. (  
      119. 1  
      120. ).  
      121. setName  
      122. (  
      123. "test"  
      124. );  
      125.   
      126. //Verify content of both maps  
      127.   
      128. System  
      129. .  
      130. out  
      131. .  
      132. println  
      133. (  
      134. userMap  
      135. );  
      136.   
      137. System  
      138. .  
      139. out  
      140. .  
      141. println  
      142. (  
      143. clonedMap  
      144. );  
      145.   
      146. }  
      147. }  

      运行结果:

      [plain] view plaincopy
       
      1. {  
      2. 1  
      3. =  
      4. User  
      5. {  
      6. name  
      7. =  
      8. ‘jay‘  
      9. ,  
      10. age  
      11. =  
      12. 26  
      13. },  
      14.   
      15. 2  
      16. =  
      17. User  
      18. {  
      19. name  
      20. =  
      21. ‘fany‘  
      22. ,  
      23. age  
      24. =  
      25. 25  
      26. }}  
      27.   
      28. Changes  
      29. reflect  
      30. in  
      31. both maps  
      32.   
      33. {  
      34. 1  
      35. =  
      36. User  
      37. {  
      38. name  
      39. =  
      40. ‘test‘  
      41. ,  
      42. age  
      43. =  
      44. 26  
      45. },  
      46.   
      47. 2  
      48. =  
      49. User  
      50. {  
      51. name  
      52. =  
      53. ‘fany‘  
      54. ,  
      55. age  
      56. =  
      57. 25  
      58. }}  
      59. {  
      60. 1  
      61. =  
      62. User  
      63. {  
      64. name  
      65. =  
      66. ‘test‘  
      67. ,  
      68. age  
      69. =  
      70. 26  
      71. },  
      72.   
      73. 2  
      74. =  
      75. User  
      76. {  
      77. name  
      78. =  
      79. ‘fany‘  
      80. ,  
      81. age  
      82. =  
      83. 25  
      84. }}  

      从运行结果看出,对cloneMap修改,两个map都改变了,所以putAll还是浅复制。

      那么,如何实现深度复制呢?

      可以使用序列化实现,如下为谷歌Gson序列化HashMap,实现深度复制的例子:

      [plain] view plaincopy
       
      1. public  
      2.   
      3. class  
      4.   
      5. CopyDeepMapTest  
      6.   
      7. {  
      8.   
      9. public  
      10.   
      11. static  
      12.   
      13. void  
      14. main  
      15. (  
      16. String  
      17. []  
      18. args  
      19. )  
      20.   
      21. {  
      22.   
      23. HashMap  
      24. <  
      25. Integer  
      26. ,  
      27.   
      28. User  
      29. >  
      30. userMap  
      31. =  
      32.   
      33. new  
      34.   
      35. HashMap  
      36. <>();  
      37.   
      38. userMap  
      39. .  
      40. put  
      41. (  
      42. 1  
      43. ,  
      44.   
      45. new  
      46.   
      47. User  
      48. (  
      49. "jay"  
      50. ,  
      51.   
      52. 26  
      53. ));  
      54. userMap  
      55. .  
      56. put  
      57. (  
      58. 2  
      59. ,  
      60.   
      61. new  
      62.   
      63. User  
      64. (  
      65. "fany"  
      66. ,  
      67.   
      68. 25  
      69. ));  
      70.   
      71. //Shallow clone  
      72.   
      73. Gson  
      74. gson  
      75. =  
      76.   
      77. new  
      78.   
      79. Gson  
      80. ();  
      81.   
      82. String  
      83. jsonString  
      84. =  
      85. gson  
      86. .  
      87. toJson  
      88. (  
      89. userMap  
      90. );  
      91.   
      92. Type  
      93. type  
      94. =  
      95.   
      96. new  
      97.   
      98. TypeToken  
      99. <  
      100. HashMap  
      101. <  
      102. Integer  
      103. ,  
      104.   
      105. User  
      106. >>(){}.  
      107. getType  
      108. ();  
      109.   
      110. HashMap  
      111. <  
      112. Integer  
      113. ,  
      114.   
      115. User  
      116. >  
      117. clonedMap  
      118. =  
      119. gson  
      120. .  
      121. fromJson  
      122. (  
      123. jsonString  
      124. ,  
      125. type  
      126. );  
      127.   
      128. //Same as userMap  
      129.   
      130. System  
      131. .  
      132. out  
      133. .  
      134. println  
      135. (  
      136. clonedMap  
      137. );  
      138.   
      139. System  
      140. .  
      141. out  
      142. .  
      143. println  
      144. (  
      145. " Changes reflect in only one map  "  
      146. );  
      147.   
      148. //Change a value is clonedMap  
      149. clonedMap  
      150. .  
      151. get  
      152. (  
      153. 1  
      154. ).  
      155. setName  
      156. (  
      157. "test"  
      158. );  
      159.   
      160. //Verify content of both maps  
      161.   
      162. System  
      163. .  
      164. out  
      165. .  
      166. println  
      167. (  
      168. userMap  
      169. );  
      170.   
      171. System  
      172. .  
      173. out  
      174. .  
      175. println  
      176. (  
      177. clonedMap  
      178. );  
      179.   
      180. }  
      181. }  

      运行结果:

      [plain] view plaincopy
       
      1. {  
      2. 1  
      3. =  
      4. User  
      5. {  
      6. name  
      7. =  
      8. ‘jay‘  
      9. ,  
      10. age  
      11. =  
      12. 26  
      13. },  
      14.   
      15. 2  
      16. =  
      17. User  
      18. {  
      19. name  
      20. =  
      21. ‘fany‘  
      22. ,  
      23. age  
      24. =  
      25. 25  
      26. }}  
      27.   
      28. Changes  
      29. reflect  
      30. in  
      31. only one map  
      32.   
      33. {  
      34. 1  
      35. =  
      36. User  
      37. {  
      38. name  
      39. =  
      40. ‘jay‘  
      41. ,  
      42. age  
      43. =  
      44. 26  
      45. },  
      46.   
      47. 2  
      48. =  
      49. User  
      50. {  
      51. name  
      52. =  
      53. ‘fany‘  
      54. ,  
      55. age  
      56. =  
      57. 25  
      58. }}  
      59. {  
      60. 1  
      61. =  
      62. User  
      63. {  
      64. name  
      65. =  
      66. ‘test‘  
      67. ,  
      68. age  
      69. =  
      70. 26  
      71. },  
      72.   
      73. 2  
      74. =  
      75. User  
      76. {  
      77. name  
      78. =  
      79. ‘fany‘  
      80. ,  
      81. age  
      82. =  
      83. 25  
      84. }}  

      从运行结果看出,对cloneMap修改,userMap没有被改变,所以是深度复制







以上是关于关于Java Map应该掌握的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Java 软件工程师应该知道或掌握的技术栈

关于java内存释放的问题

Java 集合框架帮你搞通哈希表,掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

Java 集合框架帮你搞通哈希表,掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

关于Java开发学习路线这一篇就够了

关于java object对象中的map取值问题。。。