public class TestHashMap {

    /**
* HashMap是数组和链表组合构成的数据结构
* 数组里面每个地方都存了key-value这样的实例Java7叫Entry,Java8叫Node
* 因为本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。
* 为什么需要链表?
* 我们都知道数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,就是"12"和"21"我们都去hash有一定的概率会一样,如下面情况"12"和"21"hash到一个值上,那就形成了链表。
*
* 数组容量是有限的,数据多次插入,到达一定的数量就会进行扩容,也就是resize
* 扩容条件:Capacity:HashMap当前长度;LoadFactor:负载因子,默认值0.75f
* 扩容分2步:1、扩容:创建一个Entry的空数组,长度是原数组的2倍 2、ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组
*
* 为什么要重新Hash,直接复制过去不好吗?
* 因为长度扩大以后,Hash的规则也随之改变
* Hash的公式---> index = HashCode(Key) & (Length - 1)
* 原来长度(Length)是8你位运算出来的值是4 ,新的长度是16你位运算出来的值明显不一样了。
*
* 新的Entry节点,插入链表的时候,Java8之前是头插法,Java8之后是尾部插法
* 使用头插会改变链表的上的顺序,但是如果使用尾插,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。
* Java7在多线程操作HashMap时可能引起死循环(Infinite Loop),原因是扩容转移后前后链表顺序倒置,在转移过程中修改了原来链表中节点的引用关系。
* Java8在同样的前提下并不会引起死循环,原因是扩容转移后前后链表顺序不变,保持之前节点的引用关系。
*
* java8之后链表有红黑树的部分,大家可以看到代码已经多了很多if else的逻辑判断了,红黑树的引入巧妙的将原本O(n)的时间复杂度降低到了O(logn)。
*
* HashMap的默认初始化长度 DEFAULT_INITIAL_CAPACITY = 16; DEFAULT_LOAD_FACTOR = 0.75f;
* 在创建HashMap的时候,阿里巴巴规范插件会提醒我们最好赋初值,而且最好是2的幂,
* 这样是为了位运算的方便,位与运算比算数计算的效率高了很多(效果与取模一样),之所以选择16,是为了服务将Key映射到index的算法。
* 因为在使用2的幂的数字的时候,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值,只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的(实现均匀分布)
*
* 为什么我们重写equals方法的时候需要重写hashCode方法呢?
* HashMap是通过key的hashCode去寻找index的,那index一样就形成链表了,也就是说”AB“和”BA“的index可能是一样的,在一个链表上的
* 所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值
* 不然一个链表的对象,你哪里知道你要找的是哪个,到时候发现hashCode都一样,区分不了。
*/
public static void main(String[] args) {
//集合初始化时,指定集合初始值大小
HashMap map = new HashMap<>(16);
map.put("12", "AB");
map.put("21", "AB");
map.put("11", "AB");
map.put("10", "AB");
int index1 = map.get("12").hashCode();
int index2 = map.get("21").hashCode();
int index3 = map.get("11").hashCode();
int index4 = map.get("10").hashCode();
System.out.println(map.size());//
System.out.println(index1);//
System.out.println(index2);//
System.out.println(index3);//
System.out.println(index4);//
Object o1 = map.get("12");
Object o2 = map.get("21");
Object o3 = map.get("11");
Object o4 = map.get("10");
System.out.println(o1.equals(o2));//true
System.out.println(o3.equals(o4));//true
} }

HashMap知识初探的更多相关文章

  1. JAVA hashmap知识整理

    HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vect ...

  2. 深度分享:面试阿里,字节跳动,美团90%会被问到的HashMap知识

    一,HashTable 哈希表,它相比于hashMap结构简单点,它没有涉及红黑树,直接使用链表的方式解决哈希冲突. 我们看它的字段,和hashMap差不多,使用table存放元素 private t ...

  3. Shiro知识初探(更新中)

    Shiro 是当下常见的安全框架,主要用于用户验证和授权操作. RBAC 是当下权限系统的设计基础,同时有两种解释:一: Role-Based Access Control,基于角色的访问控制即,你要 ...

  4. Java源码解读(一)——HashMap

    HashMap作为常用的一种数据结构,阅读源码去了解其底层的实现是十分有必要的.在这里也分享自己阅读源码遇到的困难以及自己的思考. HashMap的源码介绍已经有许许多多的博客,这里只记录了一些我看源 ...

  5. 关于hashcode和equals方法说明

    一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...

  6. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  7. Thrift入门初探(2)--thrift基础知识详解

    昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...

  8. 程序猿的日常——HashMap的相关知识

    背景知识 哈希冲突 哈希是指通过某种方法把数据转变成特定的数值,数值根据mod对应到不同的单元上.比如在Java中,字符串就是通过每个字符的编码来计算.数字是本身对应的值等等,不过就算是再好的哈希方法 ...

  9. 一张思维导图带你梳理HashMap相关知识

    HashMap可以说是java中最常见也是最重要的key-value存储结构类,很多程序员可能经常用,但是不一定清楚这个类背后的数据结构和相关操作原理,为了复习HashMap相关的知识,今天花了一天的 ...

随机推荐

  1. C# 读取webConfig配置

    获取百度URL  var url = System.Configuration.ConfigurationManager.AppSettings["BaiduUrl"]; < ...

  2. HTML /和./的区别 - Web开发

    "/"访问根目录 例1 https://www.cnblogs.com/test 里有 <a href="/Edsuns"></a> 则 ...

  3. JS高级---案例:验证用户输入的是不是邮箱

    案例:验证用户输入的是不是邮箱 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  4. QQ第三方登录(二)

    首先我们先来看一下我的目录 Connect2.1  是我们从下载的SDK,内容包含 其他文件在配置之后全部删除了! index.html 是我们点击登陆的页面(以下为html中的代码) <cen ...

  5. 题解【洛谷P1967】[NOIP2013]货车运输

    题面 题解 注意到有一些限重很低的边不会被走到. 于是考虑建一棵最大生成树,在生成树上寻找答案. 设\(f[i][j]\)表示\(i\)的\(2^j\)级祖先,\(w[i][j]\)表示\(i\)到\ ...

  6. CrystalDecisions.Windows.Forms文件

    1.CrystalDecisions.Windows.Forms 相关dll文件 CrystalDecisions.Crystalreports.Engine.dllCrystalDecisions. ...

  7. 后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记

    Memcached的知识点大致可以分为三个部分. 服务器部分:环境搭建. 概念:存储的数据类型,指令,内存的替换策略. 集成:与Java语言的集成. 1.搭建环境 1.1 Linux环境 在Linux ...

  8. Hadoop启动HDFS时DataNode未启动

    在用$HADOOP_HOME/sbin/start-dfs.sh启动HDFS时发现只有NameNode和SecondaryNameNode启动,没有DataNode. 查看logs下的DataNode ...

  9. css样式读取

    在做页面改写时,发现外部引入的样式表中一部分的样式起作用,另一部分的样式没有用.无论怎么修改都没有用.最后搜索了下答案,发现是css样式文件与需引入的文件编码不一致.导致样式读取不到或者读取到一半.

  10. python如何离线装包 离线如何部署python环境

    1,安装python windows: 我用的是python3.6.6.exe安装包,需要提前下载好 ubuntu: 自带的python,如果是ubuntu18.04的话,自带的应该是3.6.8 2, ...