There are eight questions about Java map

osc_a7a1prn6 2020-11-08 12:06:40
questions java map


Preface

I have read several articles about Java Map Of foreign blogs , Well written , So I sorted out Java map What should be mastered 8 A question , It's a common problem in daily development , Hopefully that helped ; If there's something wrong , Welcome to , Thank you very much ~

All codes in this chapter demo Uploaded github

1、 How to put a Map Turn into List

Daily development , We often encounter this kind of scene , Put one Map Turn into List.map turn List There are three ways of transformation :

  • hold map Key key Turn into list
  • hold map Value value Turn into list
  • hold map Key value of key-value Turn into list

    The pseudocode is as follows :

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

Sample code :

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"
);
// Put one map The bond of is converted to list
List
<
Integer
>
keyList
=
new
ArrayList
<>(
map
.
keySet
());
System
.
out
.
println
(
keyList
);
// hold map The value of is converted to list
List
<
String
>
valueList
=
new
ArrayList
<>(
map
.
values
());
System
.
out
.
println
(
valueList
);
hold
map
The key value of is converted to
list
List
entryList
=
new
ArrayList
(
map
.
entrySet
());
System
.
out
.
println
(
entryList
);
}
}

Running results :

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

2、 How to traverse a Map

We often need to traverse a map, There are two ways to do this :

adopt entrySet+for Implement traversal

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

The sample code :

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

adopt Iterator+while Implement traversal

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

The sample code :

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

Running results :

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

3、 How to base on Map Of keys Sort

Yes Map Of keys Sort , It's common in daily development , There are mainly two ways to achieve .

hold Map.Entry In the list, Reuse Comparator Yes list Sort

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

The sample code :

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

Use SortedMap+TreeMap+Comparator Realization

SortedMap
sortedMap
=
new
TreeMap
(
new
Comparator
()
{
@Override
public
int
compare
(
K k1
,
K k2
)
{
return
k1
.
compareTo
(
k2
);
}
});
sortedMap
.
putAll
(
map
);

The sample code :

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

Running results :

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

4、 How to Map Of values Sort

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

The sample code :

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

Running results :

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

5、 How to initialize a static / Immutable Map

Initialize a static immutable map, only static final+static Code blocks still don't work , as follows :

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

Inside this ,map Continue to add elements (3,"three"), Found to be OK Of , The operation results are as follows :

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

To really implement a static immutable map, need Collections.unmodifiableMap, The code is as follows :

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

The operation results are as follows :
 About Java Map, What should be mastered 8 A question

You can find , Keep going map Adding elements will report an error , To achieve what is truly immutable map.

6、HashMap, TreeMap, and Hashtable,ConcurrentHashMap The difference between

HashMap TreeMap Hashtable ConcurrentHashMap
Orderliness no yes no no
null k-v yes - yes no - yes no - no no - no
Linear safety no no yes yes
Time complexity O(1) O(log n) O(1) O(log n)
The underlying structure Array + Linked list Red and black trees Array + Linked list Red and black trees




7、 How to create an empty map

If map It's immutable , You can create :

Map
map
=
Collections
.
emptyMap
();
or
Map
<
String
,
String
>
map
=
Collections
.<
String
,
String
>
emptyMap
();
//map1.put("1", "1"); Operation error 

If you want your space map Can add elements to , You can create

Map
map
=
new
HashMap
();

8、 About map Copy

About hashmap Copy , In daily development , It's also used more . There are mainly =,clone,putAll, But they're all shallow copies , Pay attention to , Take a look at the following example :

Example a , Use = Copy a 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
);
}
}

Running results :

{
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
}}

From the operation results, it can be seen that , Yes cloneMap modify , Two map It's all changed , therefore = It's light copy .

Example 2 , Use hashmap Of clone Copy :

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

Running results :

{
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
}}

From the operation results, it can be seen that , Yes cloneMap modify , Two map It's all changed , therefore hashmap Of clone It's also a shallow copy .

Example 3 , adopt putAll operation

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

Running results :

{
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
}}

From the operation results, it can be seen that , Yes cloneMap modify , Two map It's all changed , therefore putAll Or light copy .

that , How to achieve deep replication ?

You can use serialization to achieve , Here's Google Gson serialize HashMap, Examples of implementing deep replication :

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

Running results :


{
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
}}

From the operation results, it can be seen that , Yes cloneMap modify ,userMap Not changed , So it's deep replication .

Reference and thanks

  • Top 9 questions about Java Maps
  • Best way to create an empty map in Java
  • How to clone HashMap – Shallow and Deep Copy

Official account number

 About Java Map, What should be mastered 8 A question

  • If you are a good child who loves learning , You can pay attention to my official account. , Study and discuss together .
  • If you think there is something wrong with this article , Can comment , You can also pay attention to my official account. , Talk to me in private , Let's learn and improve together .
版权声明
本文为[osc_a7a1prn6]所创,转载请带上原文链接,感谢

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云