Java一共有几个map_有关于Java Map,应该掌握的8个问题

本文总结了Java Map开发中常见的8个问题,包括如何将Map转换为List,如何遍历Map,如何根据键或值排序Map,初始化静态/不可变Map的方法,以及HashMap, TreeMap, Hashtable和ConcurrentHashMap的区别。此外,还探讨了Map的复制方法,如浅复制和深复制的实现。" 132040940,7502292,JAVA开发的蛋糕店烘焙小程序源码,"['JAVA开发', '小程序源码', 'uniapp', 'vue框架', 'springboot框架']
摘要由CSDN通过智能技术生成

前言

544de52ec7c108db296b1c2c84d06dcf.png

最近几天看了几篇有关于Java Map的外国博文,写得非常不错,所以整理了Java map 应该掌握的8个问题,都是日常开发司空见惯的问题,希望对大家有帮助;如果有不正确的地方,欢迎提出,万分感谢哈~

本章节所有代码demo已上传github

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

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

把map的键key转化为list

把map的值value转化为list

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

伪代码如下:

//keylist

List keyList = new ArrayList(map.keySet());

// value list

List valueList = new ArrayList(map.values());

// key-value list

List entryList = new ArrayList(map.entrySet());

示例代码:

publicclass Test {

publicstaticvoid main(String[] args) {

Map map = new HashMap<>();

map.put(2, "jay");

map.put(1, "whx");

map.put(3, "huaxiao");

//把一个map的键转化为list

List keyList = new ArrayList<>(map.keySet());

System.out.println(keyList);

//把map的值转化为list

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

}

实例代码:

publicclass EntryMapTest {

publicstaticvoid main(String[] args) {

Map map = new HashMap<>();

map.put(2, "jay");

map.put(1, "whx");

map.put(3, "huaxiao");

for(Map.Entry entry: map.entrySet()) {

// get key

Integerkey= (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();

}

实例代码:

publicclass IteratorMapTest {

publicstaticvoid main(String[] args) {

Map 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

Integerkey= (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)-> {

returne1.getKey().compareTo(e2.getKey());

});

实例代码:

publicclass SortKeysMapTest {

publicstaticvoid main(String[] args) {

Map map = new HashMap<>();

map.put("2010","jay");

map.put("1999","whx");

map.put("3010","huaxiao");

List> list = new ArrayList<>(map.entrySet());

Collections.sort(list, (Map.Entry e1, Map.Entry e2)-> {

returne1.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.    publicintcompare(K k1, K k2) {

4.      returnk1.compareTo(k2);

5.    }

6.  });

7.  sortedMap.putAll(map);

实例代码:

publicclass SortKeys2MapTest {

publicstaticvoid main(String[] args) {

Map map = new HashMap<>();

map.put("2010","jay");

map.put("1999","whx");

map.put("3010","huaxiao");

SortedMap sortedMap = new TreeMap(new Comparator() {

@Override

publicintcompare(String k1, String k2) {

returnk1.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进行排序

Listlist=newArrayList(map.entrySet());

Collections.sort(list, (Entry e1, Entry e2) ->{

return e1.getValue().compareTo(e2.getValue());

});

实例代码:

publicclass SortValuesMapTest {

publicstaticvoid main(String[] args) {

Map map = new HashMap<>();

map.put("2010","jay");

map.put("1999","whx");

map.put("3010","huaxiao");

List >list = new ArrayList<>(map.entrySet());

Collections.sort(list, (Map.Entry e1, Map.Entry e2)-> {

returne1.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代码块还是不行的,如下:

publicclass Test1 {

private staticfinal Map map;

static{

map = new HashMap();

map.put(1, "one");

map.put(2, "two");

}

publicstaticvoid main(String[] args) {

map.put(3, "three");

Iterator itr = map.entrySet().iterator();

while(itr.hasNext()) {

Map.Entry entry = (Map.Entry) itr.next();

// get key

Integerkey= (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,代码如下:

publicclass Test2 {

private staticfinal Map map;

static{

Map aMap = new HashMap<>();

aMap.put(1, "one");

aMap.put(2, "two");

map = Collections.unmodifiableMap(aMap);

}

publicstaticvoid main(String[] args) {

map.put(3, "3");

Iterator itr = map.entrySet().iterator();

while(itr.hasNext()) {

Map.Entry entry = (Map.Entry) itr.next();

// get key

Integerkey= (Integer) entry.getKey();

// get value

String value = (String) entry.getValue();

System.out.println("key:"+key+",value:"+value);

}

}

}

运行结果如下:

989c6cbb8c631bfd4b320dc548f37730.png

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

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

61d1101f1922d2c6e713dde3fd8bb504.png

7、如何创建一个空map

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

Map map=Collections.emptyMap();

or

Map map=Collections.emptyMap();

//map1.put("1","1"); 运行出错

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

Map map = new HashMap();

8、有关于map的复制

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

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

publicclass CopyMapAssignTest {

publicstaticvoid main(String[] args) {

Map userMap = new HashMap<>();

userMap.put(1, new User("jay", 26));

userMap.put(2, new User("fany", 25));

//Shallow clone

Map clonedMap = userMap;

//Same asuserMap

System.out.println(clonedMap);

System.out.println("\nChanges reflect in both maps \n");

//Change a value isclonedMap

clonedMap.get(1).setName("test");

//Verify content ofboth maps

System.out.println(userMap);

System.out.println(clonedMap);

}

}

运行结果:

{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}

Changes reflect inboth 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复制:

{

publicstaticvoid main(String[] args) {

HashMap userMap = new HashMap<>();

userMap.put(1, new User("jay", 26));

userMap.put(2, new User("fany", 25));

//Shallow clone

HashMap clonedMap = (HashMap) userMap.clone();

//Same asuserMap

System.out.println(clonedMap);

System.out.println("\nChanges reflect in both maps \n");

//Change a value isclonedMap

clonedMap.get(1).setName("test");

//Verify content ofboth maps

System.out.println(userMap);

System.out.println(clonedMap);

}

}

运行结果:

{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}

Changes reflect inboth 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操作

publicclass CopyPutAllMapTest {

publicstaticvoid main(String[] args) {

HashMap userMap = new HashMap<>();

userMap.put(1, new User("jay", 26));

userMap.put(2, new User("fany", 25));

//Shallow clone

HashMap clonedMap = new HashMap<>();

clonedMap.putAll(userMap);

//Same asuserMap

System.out.println(clonedMap);

System.out.println("\nChanges reflect in both maps \n");

//Change a value isclonedMap

clonedMap.get(1).setName("test");

//Verify content ofboth maps

System.out.println(userMap);

System.out.println(clonedMap);

}

}

运行结果:

{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}

Changes reflect inboth 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,实现深度复制的例子:

publicclass CopyDeepMapTest {

publicstaticvoid main(String[] args) {

HashMap 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>(){}.getType();

HashMap clonedMap = gson.fromJson(jsonString, type);

//Same asuserMap

System.out.println(clonedMap);

System.out.println("\nChanges reflect in only one map \n");

//Change a value isclonedMap

clonedMap.get(1).setName("test");

//Verify content ofboth maps

System.out.println(userMap);

System.out.println(clonedMap);

}

}

运行结果:

{1=User{name='jay', age=26}, 2=User{name='fany', age=25}}

Changes reflect inonlyone 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没有被改变,所以是深度复制。

【编辑推荐】

【责任编辑:华轩 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值