• java map初始化并赋值


    **第一种方式:**static 块

    public class MapTest {
        private static final Map myMap = new HashMap();
        static {
            myMap.put("张三", "北京");
            myMap.put("李四", "上海");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    最常规的初始化方式。

    第二种方式:双括号初始化 (匿名内部类)

    public class MapTest {
        HashMap myMap = new HashMap() {{
            put("张三", "北京");
            put("李四", "上海");
        }};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    java8新特性,双括号初始化。

    相比于第一种方式,减少了一些代码,看着舒服了不少。

    第一层括弧实际是定义了一个匿名内部类 ,第二层括弧实际上是一个实例初始化块,这个块在内部匿名类构造时被执行。

    因为这种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时,外部类也会被不知不觉的串行化,而当外部类没有实现Serialize接口时,就会报错。其二,在上面的例子中,其实是声明了一个继承自HashMap的子类,然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,也就导致了串行化失败。解决办法是重新初始化为一个HashMap对象【new HashMap(map);】,这样就可以正常进行初始化了。

    另外要注意的是,这种使用双括号进行初始化的语法在执行效率上要比普通的初始化写法要稍低。

    第三种方式:guava

    public class MapTest {
        Map myMapA = ImmutableMap.of("张三", "北京", "李四", "上海");
        // 或者
        Map myMapB = ImmutableMap.builder()
                .put("张三", "北京")
                .put("李四", "上海")
                .build();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用Guava需要引入guava依赖:

    
        com.google.guava
        guava
        28.1-jre
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    需要注意的是,ImmutableMap是不可变Map,也就是说初始化之后,不能再往里面put元素了,不然会报异常java.lang.UnsupportedOperationException。

    查看ImmutableMap源码也可以发现,调用put方法时,直接抛异常:

        @Deprecated
        @CanIgnoreReturnValue
        public final V put(K k, V v) {
            throw new UnsupportedOperationException();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    不过,实际开发中,我们用到ImmutableMap的场景都是定义系统所需的一些常量,因此,ImmutableMap很有用。

    第四种方式:对于Java 9或更高版本

    // 最多存储10个元素
    Map test1 = Map.of(
        "a", "b",
        "c", "d"
    );
    
    // 没有限制
    Map test2 = Map.ofEntries(
        entry("a", "b"),
        entry("c", "d")
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    执行mysql-community-libs-8.1.0-1.el8.x86_64.rpm报错依赖检测失败
    Java HttpClient-Restful 工具各种请求高度封装提炼总结及案例
    公众号爆文写作怎么做?或许这些领域才适合你!
    Elasticsearch 7和Elastic Stack:深入实践
    7.正则化应用
    MySQL 面试突击指南:核心知识点解析2
    史上超级详细:银行外包java面试题目
    百看不如一练系列 32个python实战项目列表,得不到就毁掉
    【1093. 大样本统计】
    Linux常用命令(精简版)
  • 原文地址:https://blog.csdn.net/m0_67401545/article/details/126386959