好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java中如何实现不可变Map详解

前言

有时最好不允许修改  java.util.map , 例如跨线程共享只读数据。为此,我们可以使用unmodifiable map或immutable map。

在这个快速教程中,我们将看到它们之间的区别。然后,我们将介绍可以创建 不可变 map的各种方法。

下面话不多说了,来一起看看详细的介绍吧

不可修改与不可变

unmodifiable map其实是一个可以修改的map的包装器,不允许直接修改它。

?

1

2

3

4

5

6

map<string, string> mutablemap = new hashmap<>();

mutablemap.put( "usa" , "north america" );

 

map<string, string> unmodifiablemap = collections.unmodifiablemap(mutablemap);

assertthrows(unsupportedoperationexception. class ,

  () -> unmodifiablemap.put( "canada" , "north america" ));

但是包装器里面底层的可变map仍然可以改变,修改也反映在不可修改的map中:

?

1

2

3

4

5

mutablemap.remove( "usa" );

assertfalse(unmodifiablemap.containskey( "usa" ));

  

mutablemap.put( "mexico" , "north america" );

asserttrue(unmodifiablemap.containskey( "mexico" ));

另一方面,不可变map包含其自己的私有数据,是不允许对其进行修改。因此,一旦创建了不可变map的实例,数据就不会以任何方式改变。

guava 不变map

guava 提供了每个java.util的不可变版本。使用  immutablemap 映射 。每当我们尝试修改它时,它都会抛出  unsupportedoperationexception。

由于它包含自己的私有数据,因此在更改原始地图时,此数据不会更改。

我们现在将讨论创建immutablemap实例的各种方法  。

1. 使用copyof()方法:

首先,让我们使用 immutablemap.copyof()  方法,该方法返回原始map中所有条目的副本:

?

1

2

immutablemap<string, string> immutablemap = immutablemap.copyof(mutablemap);

asserttrue(immutablemap.containskey( "usa" ));

它不能直接修改,但是可以改变其内部可变的map:

?

1

2

3

4

5

6

7

8

assertthrows(unsupportedoperationexception. class ,

  () -> immutablemap.put( "canada" , "north america" ));

  

mutablemap.remove( "usa" );

asserttrue(immutablemap.containskey( "usa" ));

  

mutablemap.put( "mexico" , "north america" );

assertfalse(immutablemap.containskey( "mexico" ));

2.使用builder()方法

我们还可以使用  immutablemap.builder()  方法创建原始map中所有条目的副本。

此外,我们可以使用此方法添加原始map中不存在的其他条目:

?

1

2

3

4

5

6

immutablemap<string, string> immutablemap = immutablemap.<string, string>builder()

  .putall(mutablemap)

  .put( "costa rica" , "north america" )

  .build();

asserttrue(immutablemap.containskey( "usa" ));

asserttrue(immutablemap.containskey( "costa rica" ));

3. 使用of()

最后,我们可以使用 immutablemap.of()  方法创建一个不可变的map,其中包含动态提供的一组条目。它最多支持五个键/值对:

?

1

2

3

4

immutablemap<string, string> immutablemap

  = immutablemap.of( "usa" , "north america" , "costa rica" , "north america" );

asserttrue(immutablemap.containskey( "usa" ));

asserttrue(immutablemap.containskey( "costa rica" ));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

原文链接:https://www.jdon.com/50941

查看更多关于Java中如何实现不可变Map详解的详细内容...

  阅读:34次