之所以总结这篇博客,是因为在华为技术面的时候被问到了这个问题,当时大脑一片空白,开始鹅叫,然后说了个不太了解。。。
Java中的hashcode和equals
1.关于hashcode
1.hashcode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashcode是用来在散列存储结构中确定对象的存储地址的
2.如果两个对象相同,就是适用于equals方法,那么这两个对象的hashcode一定要相同
3.如果对象的equals方法被重写,那么对象的hashcode也尽量重写,并且产生hashcode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第二点
4.两个对象的hashcode相同,并不一定表示两个对象就相同,也就是不一定适用于equals方法,只能够说明这两个对象在散列存储结构中,如hashtable,他们就是存放在同一个篮子里
2.关于equals
==用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true,而在比较引用时,如果引用指向内存中的同一对象,结果为true。
equals()作为方法,实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达,因此我们复写equals,达到比较对象内容是否相同的目的,这些是==运算符做不到的。
HashMap的实现原理
1.HashMap概述
HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作。并允许使用null值和null键,此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外,HashMap实际上是一个链表散列的数据结构, 即数组和链表的结合体。
/** HashMap java源码 * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table; static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; …… }