• 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
  • 相关阅读:
    自制操作系统系列(四):进入64位模式
    基于python的家政管理系统毕业设计源码071111
    呼吸系统药物--平喘药
    java计算机毕业设计民宿运营管理网站源码+mysql数据库+系统+lw文档+部署
    基于帝企鹅算法优化BP神经网络实现数据预测(Matlab代码实现)
    【web开发】7、Django(2)
    java写一个自动爬取统计局公开数据的程序
    验证二叉搜索树
    软件2班20240418
    【IPython的使用技巧】
  • 原文地址:https://blog.csdn.net/m0_67401545/article/details/126386959