再学Java 之 HashMap的底层实现】的更多相关文章

今天参加欢聚时代的面试,我说我自己依靠自己的理解重新实现过HashMap.描述我自己的实现思想后,面试官问“hashmap”底层如果用数组不是效率比较低吗,不是更应该用红黑树吗?我一下子就蒙了.用数组的确效率比较低,但是当初对比JDK的源码发现,JDK的确是使用数组+链表来存储实体. 回来后,急忙看了一下源码,也对比了一下JDK6 和JDK 8的HashMap,发现了不太对劲的地方.原来,当初看的是JDK 6.在这个版本的JDK的确是使用数组+链表来存储.但是到了JDK 8 的时候,为了解决碰撞…
前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然后让其他类通过类名访问他.在这里,想使用之前实训项目的第一版应用层协议的设计想法,即使用一个接口类来定义所有子类都会使用到的变量.然后,就引出了一个interface成员变量和static final的问题. (一)一个简单的问题 首先,看一段代码: //Variable.java public i…
1.hash散列算法 由于hashmap在存储过程中是数组加链表的存储过程,所以定义数组长度为16(建议是2的n次幂的长度),之后进行每个数组的地址都指向一个链表进行存储 hash表算法可对数组长度length取余,如果length是2的n次幂,则可对length-1取位运算& 例如,任意长度8是2的3次幂,随机的int值对8取余,和对7进行&运算得到的结果是一样的 ; System.); System.); 在jdk 7之前的源码中,则对hash凑得进行了2次散列处理,为了使散列更均匀…
前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static void main(String[] args){ Integer i1 = ); Integer i2 = ); System.out.println(i1 == i2); Integer i3 = ; Integer i4 = ; System.out.println(i3 == i4); Integ…
自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]…
从Java 5 之后,Java提供了一种新的循环:foreach循环,这种循环遍历数组和集合更加简洁. foreach循环语法格式如下: for ( type variableName : array | collection){ //variableName自动迭代访问每个元素 } 在很多书籍中,都能找到这么一句话“使用foreach循环迭代数组元素时,并不能改变数组元素”.如: String books = {"a","b","c"}; //…
深夜,临睡前写了个小程序,出了点小问题 public class Test_drive { public static void main(String[] args){ A a = new A(); //报错 B b = new B(); //报错 System.out.println(b instanceof A); } class A{ int a; } class B extends A{ } } 上面两个语句报错信息如下: No enclosing instance of type T…
前言:如果提到protected的访问控制级别,您的第一反应是”只能是子类才可以访问“,那么您很可能需要往下看. 首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:   private default protected public 同一个类中 √ √ √ √ 同一个包中   √ √ √ 子类中     √ √ 全局范围内       √ 在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能在子类中才…
1. java.util.HashMap的底层实现是数组+链表. 2. 简介put(key, value)方法的执行过程: 1)通过key值,使用散列算法计算出来一个hash值,用来确定该元素需要存储到数组中的哪个位置(index). 2)根据计算出来的位置(index),可以查看该位置是否被占用: 2.1)如果位置(index)未被占用,将(key\value)封装成一个节点,保存到该位置. 2.2)如果位置(index)被占用,使用key和链表中的节点一一比较: ---->如果链表中不存在该…
上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net的基础再学java,其实并不难,只不过要有更多的付出而已,但是懂多一门技术多一条出路,你说呢? 小公司一直在模仿大厂, 华为 DevOps 转型之旅 微软 DevOps 转型之旅 从未得要领,却要求有狼性效应!DevOps,在各个公司的转型过程中表现不同,所获得的成果不同 -- "全栈工程师&quo…