• 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
  • 相关阅读:
    Linux:TTY串口接收中断
    该使用什么API?APISpace给你答案
    java旅游信息分享网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    类与面向对象
    SSH服务
    计算机网络——网络安全
    k8s 资源外部版本和内部版本
    深度学习实战:基于TensorFlow与OpenCV的手语识别系统
    俩个不同对象的List获取交集通过属性来判断,JDK8Stream的使用
    PFEA112-65 3BSE050091R65 满足正确的机械和电气安装
  • 原文地址:https://blog.csdn.net/m0_67401545/article/details/126386959