How to directly initialize a Map/List/Set

Posted echo1937

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了How to directly initialize a Map/List/Set相关的知识,希望对你有一定的参考价值。

1. 只读的、单元素的容器类

Set<String> singleton = Collections.singleton("set");
List<String> singletonList = Collections.singletonList("List");
Map<String, String> singletonMap = Collections.singletonMap("key", "value");
// 以上返回的容器类均是immutable,即只读的,如果调用修改接口,将会抛出UnsupportedOperationException

 

方法二:

For Java Version 9 or higher:
// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
        "a", "b",
        "c", "d"
);

// this works for any number of elements:
import static java.util.Map.entry;
        Map<String, String> test2 = Map.ofEntries(
                entry("a", "b"),
                entry("c", "d")
        );


// 以上返回的test1和test2依然是immutable,即只读的,如果需要返回可变的,可以使用以下方法
mutableMap = new HashMap<>(Map.of("a", "b"));


// 本人环境只有JDK8,未测试实际运行结果
For Java Version 8 or higher:
Map<String, String> map = new HashMap<String, String>() {{
    put("a", "b");
    put("c", "d");
}};

/*
    1. 它生成了一个额外的匿名类,这会带来额外的内存、磁盘和启动时间的消耗;
    2. 如果这个Map对象始终被引用,那么它的外部类也无法被垃圾回收,这也会带来额外的内存消耗;

    此外,还有一种说法(未确认):
    1.这种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。
      所以当串行化这个集合时,外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错;
    2.这种方式声明了一个继承自HashMap的子类。
      然而有些串行化方法,例如通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。
 */

// 解决办法,重新初始化为一个HashMap对象:
HashMap<String, String> newMap = new HashMap<>(map);

 

以上是关于How to directly initialize a Map/List/Set的主要内容,如果未能解决你的问题,请参考以下文章

How to directly initialize a Map/List/Set

How to directly initialize a Map/List/Set

How do I force android WiFi Direct group owner to use 2.4 GHz instead of 5 GHz

Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel

Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel

Application MyTest has not been registered. This is either due to a require() error during initializ