首页 > 编程语言 >Java 中 HashMap 初始化时赋值 匿名类

Java 中 HashMap 初始化时赋值 匿名类

时间:2023-06-19 20:00:35浏览次数:59  
标签:初始化 Java HashMap map System put 串行化

Java 中 HashMap 初始化时赋值 匿名类
https://www.shuzhiduo.com/A/kjdwWMPOdN/

1、HashMap 初始化的文艺写法

HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化:
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", "test");  
map.put("age", "20");

看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:
HashMap<String, String> map = new HashMap<String, String>() {
    {
        map.put("name", "test");  
        map.put("age", "20"); 
    }
};

看起来优雅了不少,一步到位,一气呵成的赶脚。然后问题来了,这里的双括号”{{}}”到底什么意思,什么用法呢?
双括号”{{}}”,用来初始化,使代码简洁易读。
第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。

2、推而广之,可初始化ArrayList、Set

List<String> names = new ArrayList<String>() {
    {
        for (int i = 0; i < 10; i++) {
            add("A" + i);
        }
    }
};
System.out.println(names.toString());

3、Java7:增加对collections的支持
在 Java 7 中你可以像 Ruby, Perl、Python 一样创建collections了, 但是这些集合是不可变的。

List<String> list = ["item"];
String item = list[0];
  
Set<String> set = {"item"};
  
Map<String, Integer> map = {"key" : 1};
int value = map["key"];

4、文艺写法的潜在问题

文章开头提到的文艺写法的好处很明显就是一目了然。这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败。
1.此种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当时串行化这个集合时外部类也会被不知不觉的串行化,当外部类没有实现serialize接口时,就会报错。
2.上例中,其实是声明了一个继承自HashMap的子类。然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,从而导致串行化失败。解决办法:重新初始化为一个HashMap对象:

new HashMap(map);
这样就可以正常初始化了。

5、执行效率问题

当一种新的工具或者写法出现时,猿们都会来一句:性能怎么样?(这和男生谈论妹纸第一句一般都是:“长得咋样?三围多少?”一个道理:))
关于这个两种写法我这边笔记本上测试文艺写法、普通写法分别创建 10,000,000 个 Map 的结果是 1217、1064,相差 13%。
public class Test {
    public static void main(String[] args) {
        long st = System.currentTimeMillis();
        /*
        for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>() {
                {
                    put("name", "test");
                    put("age", "20");
                }
            };
        }
        System.out.println(System.currentTimeMillis() - st); // 1217
        */

for (int i = 0; i < 10000000; i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", "test");
            map.put("age", "20");
        }
        System.out.println(System.currentTimeMillis() - st); // 1064
    }
}

标签:初始化,Java,HashMap,map,System,put,串行化
From: https://www.cnblogs.com/sunny3158/p/17492059.html

相关文章

  • Java Lambda 表达式
    Java8引入了Lambda表达式,这是一项令人激动的功能,它为Java开发人员提供了一种简洁而强大的编码方式。本文将深入探讨JavaLambda表达式的概念、语法和使用方法,帮助你充分理解这一重要的特性。简介Lambda表达式是一种匿名函数,它可以作为方法参数传递,并且可以用来简化编写函数式接......
  • java后端接入微信小程序登录功能
    前言此文章是Java后端接入微信登录功能,由于项目需要,舍弃了解密用户信息的session_key,只保留openid用于检索用户信息后端框架:springboot小程序框架:uniapp流程概括官方流程:通过自定义登录态与openid,session_key关联,之后的前后端交互通过自定义登录态来识别只保留登录流程:使......
  • Linux初始化
    Linux初始化环境说明:VMware®Workstation16Procentos7.6时区设置查看时区timedatectl设置时区timedatectlset-timezoneAsia/Shanghai时间对时使用chrony网络对时安装chronyyum-yinstallchrony配置chrony使用阿里云服务器自动对时删除以下国外的服务器s......
  • Java学习_关于变量
    关于变量的使用主要分为三步骤:1.变量的声明:这一部分包括变量类型+变量名称2.变量的赋值:变量名称=数据3.变量的使用:直接引用名称即可。 这里要注意一点,如果你想要使用变量,就必须要进行这三步,尽管有时候你不知道变量要赋一个什么值,那也得赋值,你可以随便给个0或者其他的值,赋值......
  • kotlin 调用对应java实现
    kotlin调用对应java实现1.枚举kotlion默认是publiccotlin枚举enumclassDoorState{OPEN,CLOSE}--------- java实现publicstaticenumDoorState{OPEN,CLOSE;}2.class2.1dataclasskotlin调用dataclassLoginResult(变量)----......
  • 在Java中创建对象的不同方法是什么?
    在这篇快速文章中,我们将讨论在Java中创建对象的五种不同方法。我们知道,类是创建对象的模板或蓝图。让我们列出在Java中创建对象的不同方法。用Java创建对象的5种不同方法1.使用新关键字2.使用  newInstance() Class类的方法3.使用  newInstance() Constructor类的方法4.使用......
  • Java_Jdbc_连接池的testQuery/validationQuery设置
     JDBC连接池的testQuery/validationQuery设置 在《Tomcat中使用Connector/J连接MySQL的超时问题》帖子中想要增加对连接池中连接的测试/验证,防止数据库认为连接已死而Web应用服务器认为连接还有效的问题,Mysql文档中提到Tomcat文档中的例子中用的是validationQuery,但是网......
  • 【电商平台api接口】获取lazada商品评论获取评论内容、评论日期、买家昵称、评论商品
    ​ 请求获取Lazada商品评论(免费获取测试)的作用如下:1.了解商品质量:通过获取Lazada商品评论,可以了解商品的质量、使用感受等信息,从而更好地了解商品的优缺点,为购买者提供更为准确的参考。2.搜集用户反馈:通过搜集Lazada商品评论,可以了解用户对商品的反馈和意见,了解用户的需求和......
  • java反序列化(六)
    fastjson反序列化前置知识fastjson是阿里巴巴开发的一个处理json数据的开源库,简简单单解析一个json字符串是自然不会造成命令执行的,问题在于很多库为了实用性会额外实现一些功能,造成了攻击点fastjson简单使用引入依赖,先用古老版本<dependency><groupId>......
  • java~搞懂Comparable接口的compareTo方法
    Comparable接口的compareTo方法的升序或降序取决于实现该接口的类的具体实现。按照惯例,compareTo方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说:如果this对象小于传入的对象,则compareTo应该返回负数。如果this对象等于传入的对......