HashMap源码浅析

HashMap源码主要一些属性

//默认的初始化容量(2的n次方)

static final int default_inital_capacity = 16;

//最大指定容量为2的30次方

static final int maximum_capacity = 1 << 30;

//默认的加载因子

static final float default_load_factor = 0.75f;

//hashmap的底层结构,entry数组

transient Entry[] table;

//存放的key-value对的个数,决定了数组的扩容,默认16 * 0.75 = 12,当size > 12时,就扩容,而非table中

所占用的桶(table[i])个数来决定是否扩容

transient int size;

Entry内部类

 1 static class Entry<K, V> implements Map.Entry<K, V> {
 2         final K key;
 3         V value;
 4         Entry<K, V> next;    // 该Entry的下一个Entry(hash冲突时,形成链表)
 5         final int hash;     // 该Entry的hash值
 6
 7         /**
 8          * Creates new entry.
 9          */
10         Entry(int h, K k, V v, Entry<K, V> n) {
11             value = v;
12             next = n;
13             key = k;
14             hash = h;
15         }
16
17         public final K getKey() {
18             return key;
19         }
20
21         public final V getValue() {
22             return value;
23         }
24
25         //为Entry设置新的value
26         public final V setValue(V newValue) {
27             V oldValue = value;
28             value = newValue;
29             return oldValue;
30         }
31
32         public final boolean equals(Object o) {
33             if (!(o instanceof Map.Entry))
34                 return false;
35             Map.Entry e = (Map.Entry) o;
36             Object k1 = getKey();
37             Object k2 = e.getKey();
38             //在hashmap中可以存放null键和null值
39             if (k1 == k2 || (k1 != null && k1.equals(k2))) {
40                 Object v1 = getValue();
41                 Object v2 = e.getValue();
42                 if (v1 == v2 || (v1 != null && v1.equals(v2)))
43                     return true;
44             }
45             return false;
46         }
47
48         public final int hashCode() {
49             return (key == null ? 0 : key.hashCode())^(value == null ? 0 : value.hashCode());
50         }
51
52         public final String toString() {
53             return getKey() + "=" + getValue();
54         }
55     }

原文地址:https://www.cnblogs.com/codechange/p/8541943.html

时间: 2024-11-29 06:58:40

HashMap源码浅析的相关文章

java.util.HashMap源码浅析之解决hash冲突

HashMap是java无论是企业管理系统还是web或者其他应用层的程序开发,都是应用比较多的一种数据结构,正好最近面试有问到与HashMap解决hash冲突的方式(本人菜比没答上来),现浅析源码以解惑 且记录,将来在项目上尽量避免此类问题的出现,大家都知道HashMap为key-value存储,在HashMap中,HashMap本身拥有一个Entry数组,Entry则存有key-value,且对于Hashmap来讲一个key只能对应一个value     首先是put方法          

JAVA HashMap源码浅析

引言 HashMap在键值对存储中被经常使用,那么它到底是如何实现键值存储的呢? 一 Entry Entry是Map接口中的一个内部接口,它是实现键值对存储关键.在HashMap中,有Entry的实现类,叫做Entry.Entry类很简单,里面包含key,value,由外部引入的hash,还有指向下一个Entry对象的引用,和数据结构中学的链表中的note节点很类似. Entry类的属性和构造函数: final K key; V value; Entry<K,V> next; int hash

【学习笔记-集合】HashMap 源码浅析

/** * HashMap主要方法解析,jdk1.7版本的HashMap * 一.构造 * 4个构造相对之前的jdk版本功能基本不变,但是代码封装更完善. * 构造前一个参数是容量,相当于数组大小,后一个是负载因子 */ public HashMap(int initialCapacity, float loadFactor) { //当初始容量<0,抛出异常非法的参数容量 if (initialCapacity < 0) throw new IllegalArgumentException(

1.7和1.8 HashMap 源码浅析

Jdk 1.7 数据结构 1.7版本的HashMap采用数组加链表的方式存储数据,数组是用来存储数据的在数组的位置,链表则时用来存放数据的,由于根据hash可能发生碰撞,一个位置会出现多个数据,所以采用链表结构来存储数据,结构如下图所示. 基本成员变量capacity 数组的长度 // 当前数组的容量,始终保持2^n,可以扩容,扩容后是当前线程的2倍 // 1 << 4 = 1 * 2^4 1的二进制左移4位 static final int DEFAULT_INITIAL_CAPACITY

java并发:jdk1.8中ConcurrentHashMap源码浅析

ConcurrentHashMap是线程安全的.可以在多线程中对ConcurrentHashMap进行操作. 在jdk1.7中,使用的是锁分段技术Segment.数据结构是数组+链表. 对比jdk1.7,在jdk1.8中,ConcurrentHashMap主要使用了CAS(compareAndSwap).volatile.synchronized锁. 跟jdk1.8中的HashMap一样,数据结构是数组+链表+红黑树.当链表长度过长时,会转变为红黑树. jdk1.8的HashMap源码浅析,见

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

PM2源码浅析

PM2工作原理 最近在玩一个游戏,<地平线:黎明时分>,最终Boss是一名叫黑底斯的人,所谓为人,也许不对,黑底斯是一段强大的毁灭进程,破坏了盖娅主进程,从而引发的整个大陆机械兽劣化故事. 为什么要讲这么一段呢,是希望大家可以更好地理解pm2的原理,要理解pm2就要理解god和santan的关系,god和santan的关系就相当于盖娅和黑底斯在pm2中的01世界中,每一行代码每一个字节都安静的工作god就是Daemon进程 守护进程,重启进程,守护node程序世界的安宁,santan就是进程的