返回顶部
首页 > 资讯 > 精选 >Java Map应该掌握的问题有哪些
  • 658
分享到

Java Map应该掌握的问题有哪些

2023-06-16 16:06:37 658人浏览 薄情痞子
摘要

这篇文章主要介绍“Java Map应该掌握的问题有哪些”,在日常操作中,相信很多人在Java Map应该掌握的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java Map应该掌握的问题有哪些”的疑

这篇文章主要介绍“Java Map应该掌握的问题有哪些”,在日常操作中,相信很多人在Java Map应该掌握的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java Map应该掌握的问题有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

日常开发中,我们经常遇到这种场景,把一个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,可以有以下两种方式实现:

通过entrySet+for实现遍历

  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实现遍历

  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、如何根据Map的keys进行排序

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

把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实现

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、如何初始化一个静态/不可变的Map

初始化一个静态不可变的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继续添加元素(3,"three"),发现是OK的,运行结果如下:

  key:1,value:one   key:2,value:two   key:3,value:three

真正实现一个静态不可变的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应该掌握的问题有哪些

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

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

Java Map应该掌握的问题有哪些

7、如何创建一个空map

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

  Map map=Collections.emptyMap();   or   Map<String,String> map=Collections.<String, String>emptyMap();   //map1.put("1", "1"); 运行出错

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

Map map = new HashMap();

8、有关于map的复制

有关于hashmap的复制,在日常开发中,使用也比较多。主要有  =,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还是浅复制。

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

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

  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应该掌握的问题有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java Map应该掌握的问题有哪些

本文链接: https://lsjlt.com/news/284218.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java Map应该掌握的问题有哪些
    这篇文章主要介绍“Java Map应该掌握的问题有哪些”,在日常操作中,相信很多人在Java Map应该掌握的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java Map应该掌握的问题有哪些”的疑...
    99+
    2023-06-16
  • Java中应该搞懂的问题有哪些
    本篇内容介绍了“Java中应该搞懂的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题一:我声明了什么!String s = &q...
    99+
    2023-06-03
  • Java Thread应该注意的问题有哪些
    这篇文章给大家介绍Java Thread应该注意的问题有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java Thread应该注意的问题(wang hailong)XML:namespace prefix = o...
    99+
    2023-06-03
  • java swt应该注意的问题有哪些
    这篇文章主要讲解了“java swt应该注意的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java swt应该注意的问题有哪些”吧!InstallAnywhere 要注...
    99+
    2023-06-03
  • 使用ThinkPHP应该掌握哪些调试手段
    这篇文章将为大家详细讲解有关使用ThinkPHP应该掌握哪些调试手段,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之...
    99+
    2023-06-22
  • Redis中必须要掌握的20个问题有哪些
    今天就跟大家聊聊有关Redis中必须要掌握的20个问题有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。给大家分享20个必知必会、必须要掌握的Re...
    99+
    2024-04-02
  • Java 程序员必须掌握的 LeetCode 题目有哪些?
    作为一个 Java 程序员,掌握算法和数据结构是非常重要的。而 LeetCode 是一个非常好的平台,可以帮助我们练习算法和数据结构。在这篇文章中,我们将介绍 Java 程序员必须掌握的一些 LeetCode 题目,并且演示一下相应的代码...
    99+
    2023-08-21
    leetcode windows unix
  • 每个Java初学者都应该搞懂的问题有哪些
    这篇文章主要为大家展示了“每个Java初学者都应该搞懂的问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“每个Java初学者都应该搞懂的问题有哪些”这篇文章吧。每个Java初学者都应该搞懂...
    99+
    2023-06-03
  • 开发人员和管理员应该掌握的Nginx命令有哪些
    这篇文章将为大家详细讲解有关开发人员和管理员应该掌握的Nginx命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。17. 找到NginxPIDPID或进程ID是唯一的数字,用于区分Linux和类Un...
    99+
    2023-06-16
  • 测试代理IP应该考虑的问题有哪些
    小编给大家分享一下测试代理IP应该考虑的问题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!由于因特网的快速发展,对代理IP的需求也在迅速增长。市场上的代理商...
    99+
    2023-06-20
  • Java开发者必须掌握的LeetCode容器题目有哪些?
    LeetCode是一家面向程序员的在线编程平台,提供各种算法和数据结构的题目,帮助程序员提高编程能力。其中,容器类题目是Java开发者必须掌握的,因为Java的容器类是Java编程中最基础的部分之一,掌握了容器类的使用方法,可以帮助Jav...
    99+
    2023-11-10
    leetcode 容器 npm
  • Java程序员需掌握的基础有哪些
    这篇文章主要介绍了Java程序员需掌握的基础有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1匿名类Java匿名类很像局部类或内联类,只是没有名字。我们可以利用匿名类,同...
    99+
    2023-06-02
  • 需要掌握的Java算法知识有哪些
    本篇内容主要讲解“需要掌握的Java算法知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“需要掌握的Java算法知识有哪些”吧!什么是算法?在Collins大词典中有如下解释:An alg...
    99+
    2023-06-02
  • Java打包JavaScript路径时应该注意哪些问题?
    在Java应用程序中,JavaScript是一个非常重要的组成部分,可以帮助我们实现各种功能。但是,在打包JavaScript路径时,可能会遇到一些问题。在本文中,我们将探讨在Java中打包JavaScript路径时应该注意哪些问题,以及...
    99+
    2023-09-10
    打包 javascript path
  • DIV高度自适应以及应该注意的问题有哪些
    本篇文章给大家分享的是有关DIV高度自适应以及应该注意的问题有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。和大家重点讨论一下DIV高度自...
    99+
    2024-04-02
  • 使用FlexaddChild()方法时应该注意的问题有哪些
    小编给大家分享一下使用FlexaddChild()方法时应该注意的问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!FlexaddChild()方法注意事项在FlexApplication里,是不能直接用Flexad...
    99+
    2023-06-17
  • 必须掌握的数据库面试题有哪些
    本篇内容介绍了“必须掌握的数据库面试题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、为什么使用数...
    99+
    2024-04-02
  • Java中使用Map会遇到哪些问题
    Java中使用Map会遇到哪些问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下1、“你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的...
    99+
    2023-05-31
    java ava map
  • Java程序员必需掌握的基础有哪些
    小编给大家分享一下Java程序员必需掌握的基础有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 匿名类Java匿名类很像局部类或内联类,只是没有名字。我们可以利用匿名类,同时定义并实例化一个类。只有局部类...
    99+
    2023-06-16
  • Java程序员必须掌握的注解有哪些
    这篇文章主要讲解了“Java程序员必须掌握的注解有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java程序员必须掌握的注解有哪些”吧!划重点自 JDK5 推出以来,注解已成为Java生...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作