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());
//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
我们经常需要遍历一个map,可以有以下两种方式实现:
通过entrySet+for实现遍历
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实现遍历
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、如何根据Map的keys进行排序
对Map的keys进行排序,在日常开发很常见,主要有以下两种方式实现。
把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实现
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、如何初始化一个静态/不可变的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);
}
}
}
----------------------------------------------------
//真正实现一个静态不可变的map,需要Collections.unmodifiableMap,代码如下:
public class Test {
private static final Map<Integer,String> map; //凡是静态变量都得初始化
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报错
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 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还是浅复制。
那么,如何实现深度复制呢?
可以使用序列化实现,如下为谷歌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没有被改变,所以是深度复制。
推荐内容
阅读全文
AI总结
更多推荐
相关推荐
查看更多
llama_index

LlamaIndex(前身为GPT Index)是一个用于LLM应用程序的数据框架
halo

强大易用的开源建站工具。
freeCodeCamp

freeCodeCamp.org的开源代码库和课程。免费学习编程。
热门开源项目
活动日历
查看更多
直播时间 2025-04-25 15:00:00


直播时间 2025-04-23 19:00:00

GitTalk:国内首个微服务编排框架Juggle实战解析
直播时间 2025-04-22 18:31:56

字节AI 黑科技!从 Manus Agent 入门 Eino
直播时间 2025-04-09 14:34:18

樱花限定季|G-Star校园行&华中师范大学专场
直播时间 2025-04-07 14:51:20

樱花限定季|G-Star校园行&华中农业大学专场
目录
所有评论(0)