HashMap 1.8的源码分析一
2024-09-28 20:22:04
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L;
首先它是继承了AbstractMap,这个抽象类里面有很多方法,
从这个可以看出面向对象的特性,单继承,接口的多实现,
同时实现了序列号接口,可以进行网络传输,在进行网络传输的时候实体类一般都会实现序列号接口,以便传输,
在整合redis的时候,如果实体没有进行序列化,是无法传输进入到redis中的value上的
static final int DEFAULT_INITIAL_CAPACITY = << ; // aka 16
这个是进行初始化容量的,
1 << 4 这个是位运算: 二进制为 1 向前唯一四位,那么就是10000 那么换成十进制就是2的4次方 就是16,所以hashmap的初始容量为16,
static final int MAXIMUM_CAPACITY = << ;
这个是hashmap的最大容量,表示一个很大的值,大概为2的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75f;
这个表示hashmap的装载因子
static final int TREEIFY_THRESHOLD = ;
这个是1.8之后特有的,当链表结构到8时就会变成红黑树,
static final int UNTREEIFY_THRESHOLD = ;
由树变成链表的阀值
/**
* The smallest table capacity for which bins may be treeified.
* (Otherwise the table is resized if too many nodes in a bin.)
* Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
* between resizing and treeification thresholds.
*/
static final int MIN_TREEIFY_CAPACITY = 64;
当桶中的bin被树化时最小的hash表容量。(如果没有达到这个阈值,即hash表容量小于MIN_TREEIFY_CAPACITY,当桶中bin的数量太多时会执行resize扩容操作)这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。
static final int hash(Object key) {
int h;
return (key == null) ? : (h = key.hashCode()) ^ (h >>> );
}
在HashMap中,为了更好的性能,我们希望作为Key的对象提供一个合理的hash函数以便能将其合理的分配到桶中。 而在实际的HashMap中,对从对象获取的hash值又做了调整,代码过程的直接翻译就是:如果Key值为null,返回0;如果Key值不为空,返回原hash值和原hash值无符号右移16位的值按位异或的结果。
最新文章
- 6 Candy_Leetcode
- POJ3281Dining[最大流]
- [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules
- 使用虚幻引擎中的C++导论(二-UE4基类)
- nginx是一个反向代理的软件
- 电商安全无小事,如何有效地抵御 CSRF 攻击?
- [置顶] Spring中DI设置器注入
- 【转】android动画之Tween动画 (渐变、缩放、位移、旋转)
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
- oracle锁表问题解决方法
- 【ASP.NET Core】准备工作:在 Windows 10 上配置 Linux 子系统
- Linq 巧用 Max,Sum
- Java基础知识(JAVA基本数据类型包装类)
- hdu2295DLX重复覆盖+二分
- Mybatis简介、环境搭建和详解
- win10无线网连接 提示无法连接到此网络
- 基于FPGA的异步FIFO设计
- spring jpa sqls
- 重装SQL前,一定要把SQL2005、SQL2008之类的彻底删除干净
- 生成并调用so动态库
热门文章
- Oracle、SqlServer——基础知识——oracle 与 SqlServer 的区别(未完工)
- Shell编程进阶 1.3data命令
- 人工智能二之Sublime Text3环境配置
- Android 自定义带回调的Dialog 及EditText相关
- OpenCV笔记 1
- 关于android通过shell修改文件权限的学习
- (转载)Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener
- dedecms出错此问题:Cannot_modify_header_information_-_headers_already_sent_by_(output_started_at
- opencv 基本数据结构
- 联想《拯救者》U盘UEFI启动装win7[完美激活](4)