map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
1、HashMap 初始化的文艺写法
HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化:
HashMap map = new HashMap();
map.put("name", "test");
map.put("age", "20");
看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:
HashMap map = new HashMap() {
{
map.put("name", "test");
map.put("age", "20");
}
};
看起来优雅了不少,一步到位,一气呵成的赶脚。然后问题来了,这里的双括号”{{}}”到底什么意思,什么用法呢?
双括号”{{}}”,用来初始化,使代码简洁易读。
第一层括弧实际是定义了一个匿名内部类 (Anonymous Inner Class),第二层括弧实际上是一个实例初始化块 (instance initializer block),这个块在内部匿名类构造时被执行。
2、推而广之,可初始化ArrayList、Set
List names = new ArrayList() {
{
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 list = ["item"];
String item = list[0];
Set set = {"item"};
Map 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 map = new HashMap() {
{
put("name", "test");
put("age", "20");
}
};
}
System.out.println(System.currentTimeMillis() - st); // 1217
*/
for (int i = 0; i < 10000000; i++) {
HashMap map = new HashMap();
map.put("name", "test");
map.put("age", "20");
}
System.out.println(System.currentTimeMillis() - st); // 1064
}
}
map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)相关推荐
- java url类_Java中的URL类和示例 - Break易站
URL类是Internet上任何可用资源的网关.类URL表示统一资源定位符,它是指向万维网上"资源"的指针.资源可以指向简单的文件或目录,也可以引用更复杂的对象,例如对数据库或搜索 ...
- java异常判断_Java异常退出条件的判断示例代码
无论是功能性代码还是算法性代码,程序都是一系列流程的合集 既然是流程就分为:一般流程和异常流程: 一般流程保证了基本功能: 异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了: 注意,布 ...
- java重新初始化吗_Java中为何已经重新赋值的变量在输出后会初始化?
/*这是代码先定义变量用switch选择结构重新赋值后输出的变量却初始化了...*/importjava.util.Scanner;publicclass练习3{publicstaticvoidmai ...
- java 初始化顺序_Java中对象初始化顺序的详细介绍
前言 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com ...
- java中取系统时间_JAVA中获取当前系统时间(示例代码)
一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...
- java 左移负数_Java中的左移时的负数问题
java 中的左移的运算符为< 但是使用的时候要注意符号位的问题,如下: public void shiftTest() { int n = 1; while (n != 0) { n = n ...
- JAVA程序设计计时器代码_Java中的定时器Timer使用示例代码详解
一.类概述 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. 二.代码 ...
- Java Singleton类中的线程安全性的示例代码
Java Singleton类中的线程安全性的示例代码 Singleton是最广泛使用的创建设计模式之一,用于限制应用程序创建对象.在实际应用程序中,数据库连接或企业信息系统(EIS)等资源是有限的, ...
- python停止线程池_详解python中Threadpool线程池任务终止示例代码
需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...
最新文章
- 20145209 2016-2017-2 《Java程序设计》第8周学习总结
- java链接mysql数据库格式_JDBC URL连接常用数据库格式
- 科研狗的国庆与普通人的国庆有什么不同?
- OpenGL shader class自定义着色器的实例
- tensorflow 滑动平均使用和恢复
- 差距50倍!为什么Web API第一次执行这么慢?
- PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)
- 【git 基础】detached HEAD意义详解 (非顶端分支的理解)
- dataearth可视域分析_在线三维实景建模及分析
- Python 3 的新特性zz
- Android调用系统照相机
- activity 生命周期_Activity 源码解析
- python数据存储系列教程——python中mongodb数据库操作:连接、增删查改、多级路径
- 141.PHP 对象赋值
- 免费开源字体_7种华丽的免费开源字体以及何时使用它们
- Kali系统学习:弱点扫描工具NMAP实战演示
- 什么是数据标准化、中心化、归一化?SPSS又如何实现?
- IdentityServer4之Clients、Scopes、Claims与Token关联
- 林轩田机器学习基石--The Learning Problem
- spring boot日志配置文件(彩色日志)logback-spring.xml
热门文章
- tcpreplay工具安装使用
- idea导入java项目步骤,idea与eclipse项目相互导入的过程(图文教程)
- php 脚本内存耗尽,php - 内存耗尽(最小脚本) - SO中文参考 - www.soinside.com
- java中输出打印 num_System.out.print。 如何将打印输出编号?(JAVA)
- Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
- 警惕Python编程中异常处理结构可能的坑
- 微课|玩转Python轻松过二级(2.2.4节):位运算符与集合运算符
- Python一句话实现秦九韶算法快速计算多项式的值
- Python模拟大整数乘法的小学竖式计算过程
- C++ 面向对象程序三大特性之 多态