热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hashmap存多少条数据_HashMap源码解析,扩容机制及其思考

1.概述HashMap是日常java开发中常用的类之一,是java设计中非常经典的一个类,它巧妙的设计思想与实现,还有涉及到的数据结构和算

1.概述

HashMap是日常java开发中常用的类之一,是java设计中非常经典的一个类,它巧妙的设计思想与实现,还有涉及到的数据结构和算法,,值得我们去深入的学习。

简单来说,HashMap就是一个散列表,是基于哈希表的Map接口实现,它存储的内容是键值对 (key-value) 映射,并且键值允许为null(键的话只允许一个为null)。

1.1 注意事项

①根据键的hashCode存储数据。(String,和Integer、Long、Double这样的包装类都重写了hashCode方法,String比较特殊根据ascil码还有自己的算法计算,Double做位移运算【具体看源码的hashcode实现】,Integer,Long包装类则是自身大小int值),

HashMap中的结构不能有基本类型,一方面是基本类型没有hashCode方法,还有HashMap是泛型结构,泛型要求包容对象类型,而基本类型在java中不属于对象。

②HashMap的存储单位是Node,可以认作为节点。

③Hashmap中的扩容的个数是针对size(内部元素(节点)总个数),而不是数组的个数。比如说初始容量为16,第十三个节点put进来,不管前面十二个占的数组位置如何,就开始扩容。

1.2 hashmap几个特征

3d3f5e082dc5dc3054a8b6fe1d99ff81.png

2.一些概念

2.1.位运算

位运算是对整数在内存中的二进制位进行操作。

在java中 >> 表示右移 若该数为正,则高位补0,若为负数,高位补1

<

例如20的二进制为0001 0100 20>>2为 0101 0000 结果为5(左高右低)

20<<2 为 0101 0000 则为80

java中>>>和>>的区别

>>>表示无符号右移&#xff0c;也叫逻辑右移。不管数字是正数还是负数&#xff0c;高位都是补0

在hashMap源码中有很多使用位运算的地方。例如:

//之所以用1 <<4不直接用16&#xff0c;0000 0001 -> 0001 0000 则为16&#xff0c;如果用16的话最后其实也是要转换成0和1这样的二进制&#xff0c;位运算的计算在计算机中是非常快的&#xff0c;直接用位运算表示大小以二进制形式去运行&#xff0c;在jvm中效率更高。static final int DEFAULT_INITIAL_CAPACITY &#61; 1 <<4; //初始化容量

注意:左移没有<<

2.2 位运算符-(与(&)、非(~)、,或(|)、异或(^))

①与运算(&)

我们都知道&在java中表示与操作&表示按位与&#xff0c;这里的位是指二进制位。都为1才为真(1),否则结果为0&#xff0c;举个简单的例子

System.out.println(9 & 8); //1&1&#61;1&#xff0c;1&0 0&1 0&0都&#61;0&#xff0c;因此1001 1000 -> 1000 输出为8

②非运算(~)

源码 -> 取反 -> 反码 -> 加1 -> 补码 -> 取反 -> 按位非值

在Java中&#xff0c;所有数据的表示方法都是以补码的形式表示&#xff0c;如果没有特殊说明&#xff0c;Java中的数据类型默认是int,int数据类型的长度是8位&#xff0c;一位是四个字节&#xff0c;就是32字节&#xff0c;32bit.

例如5的二进制为0101

补码后为 00000000 00000000 00000000 00000101

取反后为 11111111 11111111 11111111 11111010

【因为高位为1 所以源码为负数&#xff0c;负数的补码是其绝对值源码取反&#xff0c;末尾再加1】

所以反着来末尾减1得到反码然后再取负数

末位减1&#xff1a;11111111 11111111 11111111 11111001

【后八位前面4位不动 后面 减1 1010减1 相当于 10-1为9 后四位就是 1001 】

取反后再负数&#xff1a; 00000000 00000000 00000000 00000110 为-6

System.out.println(~ 5); //输出-6

③或运算(|)

只要有一个为1&#xff0c;结果为1&#xff0c;否则都为0

System.out.println(5 | 15); //输出为15&#xff0c;0101或上1111,结果为1111

④异或运算(^)

相同为0(假)&#xff0c;不同为真(1)

System.out.println(5 ^ 15); //输出10 0101异或1111结果为1010

2.3 hashcode

hash意为散列&#xff0c;hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值&#xff0c;顶级父类Object类中含hashCode方法(native本地方法&#xff0c;是根据地址来计算值)&#xff0c;有一些类会重写该方法&#xff0c;比如String类。

重写的原因。为了保证一致性&#xff0c;如果对象的equals方法被重写&#xff0c;那么对象的hashcode()也尽量重写。

简单来说 就是hashcode()和equals()需保持一致性&#xff0c;如果equals方法返回true&#xff0c;那么两个对象的hashCode 返回也必须一样。

否则可能会出现这种情况。

假设一个类重写了equals方法&#xff0c;其相等条件为属性相等就返回true&#xff0c;如果不重写hashcode方法&#xff0c;那么依据就是Object的依据比较两个对象内存地址&#xff0c;则必然不相等&#xff0c;这就出现了equals方法相等但是hashcode不等的情况&#xff0c;这不符合hashcode的规则&#xff0c;这种情况可能会导致一系列的问题。

因此&#xff0c;在hashMap中&#xff0c;key如果使用了自定义的类&#xff0c;最好要合理的重写Object类的equals和hashcode方法。

2.4 哈希桶

哈希桶的概念比较模糊&#xff0c;个人理解是数组表中一块区域结果下面的单向链表组成的&#xff0c;在hashmap中&#xff0c;这个单向链表的头部是所在数组上第一个元素&#xff0c;单向链表如果过长超过8&#xff0c;那么这个"桶"就可能变成了红黑树(前提是数组长度达到64)。

2.5 hash函数

在程序设定中&#xff0c;把一个对象通过某种算法或者说转换机制对应到一个整形。

主要用于解决冲突的。

2.6 哈希表

也称为散列表&#xff0c;这也是一种数据结构&#xff0c;可以根据对象产生一个为整数的散列码(hashCode)。

hash冲突

HashMap之所以有那么快的查询速度&#xff0c;是因为他的底层是由数组实现&#xff0c;通过key计算散列码(hashCode)决定存储的位置&#xff0c;HashMap中通过key的hashCode来计算hash值&#xff0c;只要hashCode相同&#xff0c;hash值也一样&#xff0c;但是可能存在存的对象多了&#xff0c;不同对象计算出的hash值相同&#xff0c;这就是hash冲突。

举个例子

HashMap map &#61; new HashMap();map.put("Aa



推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 从相邻元素对还原数组的解题思路和代码
    本文介绍了从相邻元素对还原数组的解题思路和代码。思路是使用HashMap存放邻接关系,并找出起始点,然后依次取。代码使用了HashMap来存放起始点所在的adjacentPairs中的位置,并对重复的起始点进行处理。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
author-avatar
go800li
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有