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

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

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

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

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

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

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

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

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

"一代人终将老去,可总有人正年轻。"

java在hashmap初始化时赋初值的更多相关文章

  1. Java 中 HashMap 初始化时赋值

      1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化:HashMap<String, Strin ...

  2. Java中HashMap 初始化时容量(参数)如何设置合适?

    问题引入 注:本文代码源自java 9. 阿里的插件对于初始化HashMap时,调用无参构造方法,提示如下: 那么问题来了,如果已知需要向 map 中 put n次,那么需要设定初始容量为多少? 单纯 ...

  3. Java中HashMap的初始容量设置

    根据阿里巴巴Java开发手册上建议HashMap初始化时设置已知的大小,如果不超过16个,那么设置成默认大小16: 集合初始化时, 指定集合初始值大小. 说明: HashMap使用HashMap(in ...

  4. java中hashmap容量的初始化

    HashMap使用HashMap(int initialCapacity)对集合进行初始化. 在默认的情况下,HashMap的容量是16.但是如果用户通过构造函数指定了一个数字作为容量,那么Hash会 ...

  5. Java中string 创建对象时 “”和null的差别

    null和""的差别 问题一: null和""的差别 String s=null; string.trim()就会抛出为空的exception String s ...

  6. java字段中初始化的规律与如何用静态成员函数调用非静态成员

    java字段中初始化的规律: 执行以下代码,出现的结果是什么? class InitializeBlockClass{ { field=200; } public int field=100; pub ...

  7. Java学习笔记二十三:Java的继承初始化顺序

    Java的继承初始化顺序 当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执 ...

  8. Java:HashMap的实现原理(JDK1.8)

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...

  9. Java:HashMap类小记

    Java:HashMap类小记 对 Java 中的 HashMap类,做一个微不足道的小小小小记 概述 HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致.由于要保证键的唯一.不重复 ...

随机推荐

  1. mysql导入和导出数据

    Linux下如何单个库进行导入和备份操作 1.将数据导入数据库mysql -u账号 -p密码 数据库<sql脚本 mysql -uroot -proot test</home/upload ...

  2. 使用yum快速部署Oracle安装环境(11g)

    基于Linux安装过Oracle的童鞋们都应该清楚,安装Oracle的确是一件比较费时费力的差事,因为仅仅是前期的rpm包,内核参数,创建用户等等这些个步骤都让那些新手不免眼花缭乱,一不留神,就导致最 ...

  3. NYoj-街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个街区有非常多住户,街区的街道仅仅能为东西.南北两种方向. 住户仅仅能够沿着街道行走. 各个街道之 ...

  4. Coursera 机器学习笔记(八)

    主要为第十周内容:大规模机器学习.案例.总结 (一)随机梯度下降法 如果有一个大规模的训练集,普通的批量梯度下降法需要计算整个训练集的误差的平方和,如果学习方法需要迭代20次,这已经是非常大的计算代价 ...

  5. [UWP]使用Writeable​Bitmap创建HSV色轮

    1. HSV 1.1 HSV的定义 HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法,这种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观.HSV即色相.饱和度.明度(英语:Hue, ...

  6. VMware12安装虚拟机教程、Ubuntu16.04安装教程(包括vmware tools的安装)

    转自https://jingyan.baidu.com/article/c275f6ba07e269e33d756714.html 方法/步骤 1 虚拟机.Linux操作系统介绍及下载地址 虚拟机VM ...

  7. jmeter联合selenium webdriver进行自动化测试-简单1

    jmeter进行webdriver测试 背景:jmeter可以联合selenium进行基本的UI自动化进行测试,解放了手工测试的压力.那么selenium webdriver完成GUI的流程初步如下 ...

  8. innerHTML的使用

        inerHTML是html标签的属性,成对出现的标签大多数都有这个属性,用来设置或获取位于对象起始和结束标签 内的HTML.(获取HTML当前标签的起始和结束里面的内容)不包括标签本身.   ...

  9. EtherType :以太网类型字段及值

    Ethernet II即DIX 2.0:Xerox与DEC.Intel在1982年制定的以太网标准帧格式.Cisco名称为:ARPA Ethernet II类型以太网帧的最小长度为64字节(6+6+2 ...

  10. 通过SecureCRT连接虚拟机

    继续上一篇: http://www.cnblogs.com/CoolJayson/p/7430421.html 上一篇配置了虚拟机网络环境, 实际开发中通常使用SecureCRT或Xshell等连接L ...