hashcode

HashMap底层原理及简单实现

♀尐吖头ヾ 提交于 2020-02-04 23:46:50
HashMap可以用键值对来存储对象,所谓键值对,就是可以通过对象来寻找对象,是对数组索引的推广。 底层原理 存储结构 HashMap底层的实现采用了哈希表,基本结构是“数组+链表”。HashMap里面有一个叫table的Entry数组,Entry是一个用作链表节点的类,也就是说,数组的每个元素都对应着一个链表,结构如图所示: 存储过程 当调用HashMap的put方法时 首先,会计算key对象的哈希码,也就是调用它的hashcode()方法,一般是根据地址求出的。 然后,通过特定的算法计算出哈希码对应在 [0,数组长度-1) 区间内的哈希值,例如图中是让哈希码模16,求出对应的哈希值是15; 最后在table数组对应位置的链表中添加value对象(在添加的过程中会比较,将相同key值的对象覆盖掉) 注:两种最极端的计算哈希值算法:1.hashCode / hashCode 退化成一个链表 2.hashCode / 1退化成一个数组 注:为了提高效率,会将模运算换成位运算,当length是2的幂次时,hashCode & (length - 1)等效于hashCode % length 注:JDK8中,当链表长度大于8时,会将链表转化成一颗红黑树,提高查找效率 查找键值对过程 查找的过程类似于存储过程,只不过把存改为找到后返回。 根据key值求出hashCode

Java 小结

北城以北 提交于 2020-02-04 10:17:39
1 hash • string的hashcode计算: hashcode=hashcode*31+string值 • hash下标的计算: [(hashcode>>16)异或hashcode]&(n-1),n是2的倍数(,负载因子默认0.75 • resize的实现 首先容量翻倍(便于resize的实现),然后,计算(hashcode)&n 的首位(即高四位的最低一位),如果是0的位子,下标不变,如果是1的位子,下标变为之前的值+空间容量增量。一条链表变成两条链表。进行判断,改变索引。 2.反射的三种方式 • 通过Class类的静态方法实现: class1=Class.froName(“类名"); • 通过class属性: class=Personcc.class; • 通过getClass方法: Person person=new Person(); Class<?> class=peison.getClass(); 3.静态代理和动态代理 • 静态代理: 代理对象和目标对象均实现同一个行为接口,代理类和目标类分别具体实现接口逻辑,在代理类的构造函数中实例化一个目标对象,在代理类中调用目标对象的行为接口。 • 动态代理: 提供实际类,利用反射机制,自动生成代理类,也可对需要增强的方法进行定位,避免静态带来的麻烦。 4.序列化 序列化是一种持久化存储文件

HashMap和HashTable到底哪不同?

♀尐吖头ヾ 提交于 2020-02-04 07:45:38
          HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 /*--> */ /*--> */ 代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable* @author Arthur van Hoff* @author Josh Bloch* @author Neal Gafter 以下是HashMap的作者: 以下代码及注释来自java.util.HashMap* @author Doug Lea* @author Josh Bloch* @author Arthur van Hoff* @author Neal Gafter 可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看https://en.wikipedia.org/wiki/Doug_Lea。 3. 对外的接口(API)

Java hashtable和hastmap的区别

强颜欢笑 提交于 2020-02-04 07:23:19
1、 继承和实现区别    Hashtable是基于陈旧的Dictionary类 ,完成了Map接口;HashMap是Java 1.2引进的Map接口的一个实现( HashMap继承于AbstractMap ,AbstractMap完成了Map接口)。   2、 线程安全不同    HashTable的方法是同步的,HashMap是未同步 ,所以在多线程场合要手动同步HashMap。   3、 对null的处理不同    HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以) 。即 HashTable不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。 HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断 。   4、 方法不同   HashTable有一个 contains(Object value),功能和containsValue(Object value)功能一样 。   5、

If getHashCode() for string or integer is not guaranteed to be unique why use it?

限于喜欢 提交于 2020-02-04 03:25:39
问题 As i wrote in the title. If its not safe to use getHashCode() in your application, why use it? (for string and integer) I want to use it to intersect methods and except metods in Linq models or create my own IEqualityCompare class. It feels like a chance - if its not 100% secure? Or have i missed something? As quoted in String.GetHashCode Method in https://docs.microsoft.com/ Important If two string objects are equal, the GetHashCode method returns identical values. However, there is not a

If getHashCode() for string or integer is not guaranteed to be unique why use it?

流过昼夜 提交于 2020-02-04 03:25:07
问题 As i wrote in the title. If its not safe to use getHashCode() in your application, why use it? (for string and integer) I want to use it to intersect methods and except metods in Linq models or create my own IEqualityCompare class. It feels like a chance - if its not 100% secure? Or have i missed something? As quoted in String.GetHashCode Method in https://docs.microsoft.com/ Important If two string objects are equal, the GetHashCode method returns identical values. However, there is not a

为新员工分配部门

断了今生、忘了曾经 提交于 2020-02-03 21:19:22
import java.util.Scanner; public class Example { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入新员工的姓名:"); String name = scan.nextLine();// 接收员工名称 System.out.println("请输入新员工应聘的编程语言:"); String language = scan.nextLine();// 接收员工应聘的编程语言 // 根据编程语言确定员工分配的部门 System.out.println("编程语言的hashCode:"+language.hashCode()); switch (language.hashCode()) { case 3254818:// java的哈希码 case 2301506:// Java的哈希码 case 2269730:// JAVA的哈希码 System.out.println("员工"+name+"被分配到Java程序开发部门。"); break; case 3104:// c#的哈希码 case 2112:// C#的哈希码 System.out.println("员工"+name+

Set,List,Map,Vector,ArrayList的区别

十年热恋 提交于 2020-02-03 14:05:32
Set,List,Map,Vector,ArrayList的区别 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口   Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。   所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。   如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子

精选21道Java后端面试题,看完你也能唬住面试官拿30K

拈花ヽ惹草 提交于 2020-02-03 01:03:51
如何用数组实现队列? 用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。 内部类访问局部变量的时候,为什么变量必须加上final修饰? 因为生命周期不同。局部变量在方法结束后就会被销毁,但内部类对象并不一定,这样就会导致内部类引用了一个不存在的变量。 所以编译器会在内部类中生成一个局部变量的拷贝,这个拷贝的生命周期和内部类对象相同,就不会出现上述问题。 但这样就导致了其中一个变量被修改,两个变量值可能不同的问题。为了解决这个问题,编译器就要求局部变量需要被final修饰,以保证两个变量值相同。 在JDK8之后,编译器不要求内部类访问的局部变量必须被final修饰,但局部变量值不能被修改(无论是方法中还是内部类中),否则会报编译错误。利用javap查看编译后的字节码可以发现,编译器已经加上了final。 long s = 499999999 * 499999999 在上面的代码中,s的值是多少? 根据代码的计算结果,s的值应该是-1371654655,这是由于Java中右侧值的计算默认是int类型。 NIO相关,Channels、Buffers、Selectors NIO(Non-blocking IO)为所有的原始类型提供(Buffer)缓存支持,字符集编码解码解决方案

java基础面试题(六)

走远了吗. 提交于 2020-02-02 23:55:47
什么叫做内部类?内部类有几种? 答:定义在类内部的类称为内部类。内部类分为静态内部类,成员内部类,局部内部类,匿名内部类4种。 什么是静态内部类? 答:定义在类内部的静态类称为静态内部类。静态内部类里可以有静态变量,方法和构造函数等,静态内部类不能访问外部类的成员变量,只能访问外部类的类变量。静态内部类通过"外部类.静态内部类"的方式来调用。静态内部类属于类级别。 什么是成员内部类? 答:定义在类内部的非静态类称为成员内部类。成员内部类是非静态的,所以无法定义静态方法和变量,不过final修饰的除外。成员内部类属于对象级别。 什么是局部内部类? 答:定义在一个方法内部的类叫做局部内部类。局部内部类如果要访问局部变量,那么这个局部变量就要声明为final类型。 什么是匿名内部类? 答:一个没有具体命名的内部类就叫做匿名内部类。匿名内部类通过继承一个父类或者实现一个接口的方式来直接定义并使用。 说说对hashCode和equals方法的一些理解? 答:equals结果相等的两个对象,hashcode的值一定是相等的。 equals结果不相等的两个对象,hashcode的值不一定是不相等的。 hashcode的值不相等,那么两个对象的equals结果一定是不等的。 hashcode的值相等,那么两个对象的equals结果可能相等,也可能不等。 如果两个对象equals的结果是相等