java在hashmap初始化时赋初值过程解析

 更新时间:2019年10月10日 14:40:10   作者:杨冠标  
这篇文章主要介绍了java在hashmap初始化时赋初值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java中的HashMap是一种常用的数据结构,一般用来做数据字典或者Hash查找的容器。

一般我们初始化并赋初值是这样做的:

HashMap<String, Object> map = new HashMap<>();
map.put("name", "yanggb"); 
map.put("lover", "huangq");

但是有时候我们会想在一个表达式中完成初始化并赋初值的操作:

HashMap<String, Object> map = new HashMap<>() {
  {
    put("name", "yanggb");
    put("lover", "huangq");
  }
};

这里用了双括号【{{}}】来初始化,使代码简洁易读。第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (Instance Initializer Block),这个块在内部匿名类构造时被执行。这种写法的好处很明显,就是一目了然。但是这种写法可能导致这个对象串行化失败的问题。

其一,因为这种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时,外部类也会被不知不觉的串行化,而当外部类没有实现Serialize接口时,就会报错。

其二,在上面的例子中,其实是声明了一个继承自HashMap的子类,然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,也就导致了串行化失败。解决办法是重新初始化为一个HashMap对象【new HashMap(map);】,这样就可以正常进行初始化了。

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

最后,这个使用双括号进行初始化的语法同样适用于ArrayList和Set等集合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java 17的一些新特性介绍

    Java 17的一些新特性介绍

    这篇文章主要介绍了Java 17的一些新特性介绍,Java添加了许多Java开发人员渴望的特性和改进,下文就来学习一下这些特性吧,需要的朋友可以参考一下
    2022-04-04
  • idea快速实现将SpringBoot项目打包Docker镜像并部署

    idea快速实现将SpringBoot项目打包Docker镜像并部署

    本文主要介绍了idea快速实现将SpringBoot项目打包Docker镜像并部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • spring boot2结合mybatis增删改查的实现

    spring boot2结合mybatis增删改查的实现

    这篇文章主要给大家介绍了关于spring boot2结合mybatis增删改查的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot2具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Log4j按级别输出日志到不同文件的实现方法

    Log4j按级别输出日志到不同文件的实现方法

    下面小编就为大家带来一篇Log4j按级别输出日志到不同文件的实现方法。
    2016-11-11
  • Java虚拟机内存分配与回收策略问题精细解读

    Java虚拟机内存分配与回收策略问题精细解读

    Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存,本文让我们来详细了解
    2021-11-11
  • Java流程控制语句最全汇总(中篇)

    Java流程控制语句最全汇总(中篇)

    这篇文章主要介绍了Java流程控制语句最全汇总(中篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为中篇,需要的朋友可以参考下
    2023-01-01
  • Java多线程Thread基础学习

    Java多线程Thread基础学习

    每一个正在执行的程序都是一个进程,资源只有一块,所以在同一时间段会有多个程序同时执行,但是在一个时间点上,只能由一个程序执行,多线程是在一个进程的基础之上的进一步划分,需要的朋友可以参考下
    2023-04-04
  • Spring Boot配置线程池拒绝策略的场景分析(妥善处理好溢出的任务)

    Spring Boot配置线程池拒绝策略的场景分析(妥善处理好溢出的任务)

    本文通过实例代码给大家介绍下如何为线程池配置拒绝策略、如何自定义拒绝策略。对Spring Boot配置线程池拒绝策略的相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • java中多个@Scheduled定时器不执行的解决方法

    java中多个@Scheduled定时器不执行的解决方法

    在应用开发中经常需要一些周期性的操作,比如每5分钟执行某一操作等,这篇文章主要给大家介绍了关于java中多个@Scheduled定时器不执行的解决方法,需要的朋友可以参考下
    2023-04-04
  • java用户管理注册功能 含前后台代码

    java用户管理注册功能 含前后台代码

    这篇文章主要介绍了java用户管理注册功能,含前端和后台代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10

最新评论