引言

package com.azdebugit.test.collection;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class TestHashMap {public static void main(String[] args) {Map Man = new HashMap<Integer, Integer>(){{put(1,3);put(7,9);put(3,0);put(5,6);}};Set<Map.Entry<Integer, Integer>> entrySet = Man.entrySet();for(Map.Entry<Integer, Integer> temp:entrySet) {System.out.println(temp.getKey() + ": " + temp.getValue());}}}

其中

Map Man = new HashMap<Integer, Integer>(){{put(1,3);put(7,9);put(3,0);put(5,6);}};

HashMap双花括号,进行初始化数据,看起来是不是有点另类……

双括号写法的原理:

第一层括弧,实际是定义了一个内部匿名类 (Anonymous Inner Class),

第二层括弧,实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。这个块之所以被叫做“实例初始化块”,是因为它们被定义在了一个类的实例范围内。

解析原因

在cmd中,进行编译

java TestHashMap.java

生成两个类

正如,双括号写法的原理一样,生成一个TestHashMap.class(外部实体类),及TestHashMap$1.class  (内部匿名类)

TestHashMap.class(外部实体类)

import java.util.HashMap;final class TestHashMap$1extends HashMap<Integer, Integer>
{TestHashMap$1(){put(Integer.valueOf(1), Integer.valueOf(3));put(Integer.valueOf(7), Integer.valueOf(9));put(Integer.valueOf(3), Integer.valueOf(0));put(Integer.valueOf(5), Integer.valueOf(6));}
}

TestHashMap$1.class  (内部匿名类)

import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class TestHashMap
{public static void main(String[] paramArrayOfString){HashMap local1 = new HashMap() {};Set localSet = local1.entrySet();for (Map.Entry localEntry : localSet) {System.out.println(localEntry.getKey() + ": " + localEntry.getValue());}}
}

总结

Java HashMap双花括号初始化数据,好处就是代码简洁。

但是会有以下坏处,如果这个对象要串行化,可能会导致串行化失败。

  • 此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时,外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
  • 上例中,其实是声明了一个继承自Hashset的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。

解决办法:重新初始化为一个Hashset对象(待验证)

new HashMap(map);

以上用法,做数据测试,还是可以的,在应用代码中,不建议尝试!

Java HashMap双花括号初始化数据的代码解析,及带来的问题分析相关推荐

  1. java 实现违章_基于JAVA的车辆违章查询数据调用代码实例

    基于JAVA的车辆违章查询数据调用代码实例 代码描述:基于JA V A的车辆违章查询数据调用代码实例 相关平台:聚合数据 import java.io.BufferedReader; import j ...

  2. java 实现违章_基于JAVA的违章查询助手数据调用代码实例详解

    [Java]代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; ...

  3. java 实现违章_基于JAVA的违章查询助手数据调用代码实例

    1.[代码][Java]代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExce ...

  4. html中违章查询的代码,基于JAVA的车辆违章查询数据调用代码实例

    params.put("format","");//格式选择1或2,默认1 params.put("callback","&quo ...

  5. java hashmap keyset_Java ConcurrentHashMap keySet()用法及代码示例

    Java中的ConcurentHashMap类的keySet()方法用于从哈希映射中包含的关键元素中创建一个集合.它本质上返回键的集合视图,或者我们可以创建一个新集合并将键元素存储在其中. 用法: C ...

  6. java的3个初始化_通过实例解析Java类初始化和实例初始化

    一.背景: 存在类Father和类Son,其中类Son继承了Father类. 1.父类Father代码 2.子类Son代码 *初始化包括? 成员变量赋初值.代码块.构造器 注意方法是被调用的,有人调用 ...

  7. 西部数据硬盘 代码解析

    基本组合代号包含6组符号 1.公司名称(WD)2.容量(GB级/TB级)(注:1TB按1000GB计算)3.尺寸和相对应的容量4.系列和相对应的用途5.转速和缓存6.接口类型 1.公司名称WD=Wes ...

  8. java三色球问题_C语言三色球问题代码解析

    问题描述 一个口袋中放有12个球,已知其中3个是红的,3个是白的,6个是黑的,现从中任取8个,问共有多少种可能的颜色搭配? 问题分析 根据问题描述可设任取的8个球中红球为m个,白球为n个,则黑球为8- ...

  9. 华为OD机试 -众数和中位数(Java) | 机试题+算法思路+考点+代码解析 【2023】

    众数和中位数 题目 众数是指一组数据中出现次数多的数 众数可以是多个 中位数是指把一组数据从小到大排列,最中间的那个数, 如果这组数据的个数是奇数,那最中间那个就是中位数 如果这组数据的个数为偶数,那 ...

最新文章

  1. 七分结构三分代码-直立车想节能
  2. linux 自学系列:chown 目录权限设置
  3. Python常用模块之re模块
  4. 清华博士教你如何用推荐算法技术「找到女朋友」
  5. Tomcat - Maven plugin: 运行找不到webapp
  6. Java描述设计模式(22):策略模式
  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
  8. 概率论-随机事件及其概率
  9. 【教程】如何批量制作线刷包和卡刷包
  10. 计算机c盘用户里的APPDATA,appdata是什么文件夹 C盘Appdata文件能不能删除?
  11. CodeForces - 884B Japanese Crosswords Strike Back
  12. Jupyter Notebook 内核似乎挂掉了,它很快将自动重启
  13. 不删除其他盘的文件情况下扩充C盘空间
  14. IP-Guard申请外发流程说明
  15. idea工具推荐几款好用的代码theme主题颜色
  16. 个人看过较好的电影推荐
  17. 用EXCEL计算NPV,PV,FV
  18. CobaltStrike 生成office宏病毒进行钓鱼攻击
  19. latex输入3.3.1类型的标题
  20. RISC-V 指令格式

热门文章

  1. Android进程间通讯AIDL使用及问题详解(雷惊风)
  2. 人脸识别摄像头开发板和模组选型
  3. android 9.0 SystemUI状态栏下拉快捷添加截图快捷开关
  4. el-tree 关键字搜索
  5. radeon r600 hpd中断处理
  6. Android uiautomatorviewer无法启动
  7. 无处安放         (此刻心情)
  8. remove debug symbols to a seperate file
  9. 张博涵清华大学_2009年北大,清华提前录取保送生人数最多的 33所中学
  10. 解决kettle部署在linux中界面变成英文的问题