Java 中 HashMap 初始化时赋值

合理设置 HashMap 初始值大小 HashMap初始化容量设置 阅读详情

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
    }
}
论文阅读笔记(一)细粒度图像检索 0、参考文献 [1]见微知著 http://geek.csdn.net/news/detail/191718 [2]Xiu-Shen Wei 《Selective Convolutional Descriptor Aggregation for Fine-Grained Image Retrieval》 [3]Lingxi Xie 《Fine-Grained Image Search》 1... 阅读详情

相关推荐

STM32CubeMx+stm32f407+FreeRTOS+LAN8720实现LWIP以太网UDP TCP数据收发功能

单片机实现LWIP的调试

qq_40600203的博客 3013

hashmap如何初始化

现在知道的有两种: 1) Map hashMap = new HashMap(){             {             put("A", "a");             put("B", "b");             }             }; 2)使用静态初始化块 Map hashMap = new HashMap(); s

热爱我的热爱 1万+

TI_SDCard_boot_utility_v1_0.exe

稀缺资源,在新的StarterWare包里是找不到的。

Java中Map集合初始化赋值

Java中Map集合初始化赋值

Tianl1997的博客 1万+

HashMap 原理之 HashMap 初始化(基于 JDK1.8)

基于 JDK1.8 进行分析 首先说几个问题,然后根据问题去分析具体情况 Q1. 默认容量是多少,负载因子是多少,扩容倍数? Q2. 底层的存储数据结构? Q3. 如何处理 hash 冲突? Q4. 如何计算一个 key 的 hash 值? Q5. 数组的长度为何是 2 的幂次方? Q6. 扩容查找过程? 开始之前,先看一下 HashMap 的几个基本属性。 /** * 默认的初始化容量,必须是 2 的 幂次方 */ static final int DEFAULT_INITIAL_CAPACIT..

qwli7 6421

Hashmap源码详解

hashMap的存储流程这包含哈希冲突、解决冲突、扩容、数据结构、hashMap是怎么扩容的在hashMap里面,有两种场景会进行扩容。第一种就是,在初始化,如果HashMap的构造方法你没有指定参数,那么容器初始容量为0,在第一次put方法,会进行一次扩容,扩容的默认容量大小为16。如果构造方法指定参数,那么HashMap会根据这个参数进行初始化容量,容量大小要是接近这个参数的2的幂,也就是说传入的参数是7,hashMap并不会创建容量为7的,而是会创建容量大小为8。

aaaa1312的博客 1596

java map的初始化赋值_JavaHashMap 初始化赋值

1、HashMap 初始化的文艺写法HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap map = new HashMap();map.put("name", "test");map.put("age", "20");看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:HashMap map = new Has...

weixin_42115513的博客 3216

map java 初始化赋值_JavaHashMap 初始化赋值

1、HashMap 初始化的文艺写法HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap map = new HashMap();map.put("name", "test");map.put("age", "20");看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:HashMap map = new Has...

weixin_34012355的博客 611

JavaHashMap/ List初始化赋值

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

weixin_39516640的博客 961

JavaHashMap/List初始化赋值

1、HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap<String, String> map = new HashMap<String, String>(); map.put("name", "test"); map.put("age", "20"); 看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了: HashMap<String, Strin

strggle_bin的博客 3185

java map 赋值_JavaHashMap 初始化赋值

1、HashMap 初始化的文艺写法HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap map = new HashMap();map.put("name", "test");map.put("age", "20");看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:HashMap map = new Has...

weixin_34851528的博客 1240

java hash初始化赋值弊端_JavaHashMap 初始化赋值

1、HashMap 初始化的文艺写法HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap map = new HashMap();map.put("name", "test");map.put("age", "20");看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:HashMap map = new Has...

weixin_29197835的博客 252

map java 初始化赋值_JavaHashMap 初始化赋值(示例代码)

1、HashMap 初始化的文艺写法HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化HashMap map = new HashMap();map.put("name", "test");map.put("age", "20");看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了:HashMap map = new Has...

weixin_35414887的博客 559

JavaHashMap 初始化赋值java基础面试笔试题

我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。 扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。 1、HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化: Has...

ccc_ccc8的博客 496

java hash初始化赋值弊端_javahashmap初始化赋初值

Java中的HashMap是一种常用的数据结构,一般用来做数据字典或者Hash查找的容器。一般我们初始化并赋初值是这样做的:HashMap map = new HashMap<>();map.put("name", "yanggb");map.put("lover", "huangq");但是有候我们会想在一个表达式中完成初始化并赋初值的操作:HashMap map = new Ha...

weixin_28808145的博客 240
上一篇: java中的初始化块和静态块
下一篇: 代码覆盖率工具Cobertura
go2shell
博客等级 码龄12年 45粉丝 43原创
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值