JDK源码之Map
来源:互联网 发布:linux 源码安装 编辑:程序博客网 时间:2024/05/18 03:20
1. HashMap
HashMap初始化的方式有四种。
创建一个Entry数组,默认初始长度为16,当大于0.75的时候,扩展为当前的2倍。有4中初始化map的方式。
Map<String,String> map = new HashMap<String, String>();
Map<String,String> map2 = new HashMap<String, String>(17);
Map<String,String> map3 = new HashMap<String, String>(15, 2f);
Map<String,String> map4 = new HashMap<String, String>(map);
map3中的入参,当不传入时,默认是initialCapacity=16,loadFactor=0.75.当loadFactor大于1时,会出现当size大于数组长度后依然不扩展数组,这样会导致数组中已存在的Entry对象的next值不是null,调用get方法时,需要遍历,导致性能变慢。当initialCapacity传入时,数组的长度也不是initialCapacity,而是大于initialCapacity的最小的2的N次方。
put方法中,当e.hash == hash && ((k = e. key) == key || key.equals(k))时,会覆盖之前的value。所以,如果key的类重写了equals方法,而没有重新hashcode方法,可能会导致不覆盖之前的value。get/put等方法不是同步方法,是非线程安全的。
2. LinkedHashMap
LinkedHashMap继承自HashMap。比HashMap多了一个Entry header。Entry类也比HashMap多了before和after,用来记录存入的顺序,所以LinkedHashMap中的table其实是一个存在数组中的链表。所以LinkedHashMap是有序的。在数组中的顺序与HashMap是一致的,get和put方法也于HashMap一致。
3. HashTable
HashTable与HashMap初始化方式一致,只是默认的initialCapacity=11.HashTable中的get/put等方法是同步方法。是线程安全的。
总结:相比LinkedHashMap,HashMap无序,但是节省内存,相比HashTable,HashMap是非线程安全的,所以效率比较高。
hash方法写的很简单,还有indexFor方法,应该算是hash算法吧,但是完全看不明白。
0 0
- JDK源码之Map
- jdk源码之Map
- JDK源码阅读之Map接口
- JDK源码 -- Map篇
- JDK源码阅读之Map接口和Set接口
- 【JDK源码阅读9-util】Map接口之LinkedHashMap
- JDK之Map
- jdk研究之map集合
- JDK源码之AbstractCollection
- JDK源码之-HashMap
- jdk源码之String
- JDK-Map源码浅析——IdentityHashMap
- JDK源码学习系列12----Map总结
- 【JDK源码阅读7-util】Map接口
- HashSet源码解析&Map迭代器 给jdk写注释系列之jdk1.6容器(6)
- JDK源码分析之String
- JDK源码学习之ArrayList
- JDK源码学习之String
- Xamarin.Forms入门困扰与解决方式-第三篇
- ANDROID L——RecyclerView,CardView导入和使用(Demo)
- UITextView设置超链接,点击跳转到应用内的webView
- TCP与UDP详解
- 水晶苍蝇拍:低估和高估
- JDK源码之Map
- iOS中堆和栈的区别
- ANDROID L——Material Design详解(动画篇)
- fastJosn序列化和反序列化学习
- 监控Tomcat日志,如果OutOfMemory,重启Tomcat
- python中的select相关介绍
- What is Linux System Calls and Library Functions?
- Virtualbox虚拟机无法识别usb
- ANDROID L——Material Design综合应用(Demo)