一、Object的HashCode定义

 public native int hashCode();

  Object类的hashCode方式使用了native修饰也就意味着真正的实现调用的其他语言编写的方法,我们可以忽略具体的实现,从方法的定义上可以看出,hashCode其实是一个int型的整数

  以下是hashCode()这个方法的官方解释

Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by java.util.HashMap. 

The general contract of hashCode is: 

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the java.lang.Object.equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

解释一下

1、hashcode()这个方法主要为了给hash系列的集合(HashMap、HashTable、HashSet)提供支持

2、一个应用在一次执行过程中调用同一个对象的hashcode()方法返回值是一样的,多次执行(关闭应用再启动)应用程序返回值可能不一致。由此推测hashcode()底层实现方法跟内存地址有关。

3、如果两个对象进行equals比较返回True,那么这两个对象的hashcode()方法必须返回同样的值。在一些重写equals方法的场合务必注意重写hashcode方法以便于达到这样的要求。关于equals的介绍可以参照这篇文章《Java-从堆栈常量池解析equals()与==

4、是两个对象equals--->hashcode相等,但是hashcode相等并不能推出两个对象equals。原因是hashcode的计算方法是对象的某种属性进行的数学运算后得到的值,难免会出现两个不同的对象(equals返回false)得出一样的hashcode(通常情况概率极小)

二、String对象的hashcode

  public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

其中hash是一个缓存,一个String对象计算过hashcode之后就不用再次计算了,因为即使是再次计算它的值还是一样的。value是String对象(由一个个字符构成)的字符数组

算法其实实现了这么一个逻辑运算:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1],n代表String的长度,简单吧:hashcode就是一个算数运算后的int值,它一般可以唯一标识一个对象,如果遇到两个不同的对象hashcode一样(概率很小),还要看一样两个对象是否equals。总之还是可以区分开的。

三、对象为什么要有hashcode这个属性

  前面提到hashcode可以给hash系列的集合提供支持,那么也就是说hash系列的容器需要这个属性才设置的这个属性,那么为什么要有hash系列的容器呢?

  容器的主要作用是存储对象,检索对象。通常情况下:

  ①、Array直接通过索引检索对象速度极快,但是Array的特点是一旦确定容量就不能变化了

  ②、Collection,Map的之类解决了容器容量变化的问题,我们知道他们的实现类有很多,也是各有各的特点,园子里有位达人总结的很好参照:《Java 集合系列目录(Category)》。

  区别主要:

  a)、Array可以存放基本类型数据,集合类存储的是Object

  b)、List中元素是可重复的有序的(可通过get(index)方法返回元素,Set中元素是不可重复的并且是无须的(无法通过索引取到元素),List、Set元素是单一的,Map中的元素是key-value对

  c)、插入数据,检索数据,修改数据三方面的效率上看可以理解为ArrayList基于数组实现检索数据效率高插入修改数据效率高,LinkedList基于链表实现插入修改数据效率高检索数据效率低

  d)、HashSet与TreeSet主要是有序无须的差别,后者可以有序遍历Set中的元素

  e)、同理HashMap与TreeMap的区别与d中所述一直因为d是基于e实现的

  ③、hash系列的容器其实主要是为了解决了容器插入数据,检索数据,修改数据效率折中的问题而产生的,用hashcode标识对象在集合中的位置对于排序,检索,修改数据都较快。

Java--神奇的hashcode的更多相关文章

  1. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  2. java中的hashcode

    hashcode的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode.在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括 ...

  3. 千万不要误用 java 中的 HashCode 方法

    刚才debug追堆栈的时候发现一个很奇怪的问题 我用IE8和Google的浏览器访问同一个地址 Action的 scope="session" 也设置了 而且两个浏览器提交的参数m ...

  4. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  5. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  6. K:java中的hashCode和equals方法

      hashCode和equals方法是Object类的相关方法,而所有的类都是直接或间接的继承于Object类而存在的,为此,所有的类中都存在着hashCode和equals.通过翻看Object类 ...

  7. Java 基础:hashCode方法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注J ...

  8. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  9. Java中的hashcode方法

    一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode.在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列 ...

  10. java 中的 hashcode

    在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没 ...

随机推荐

  1. 关于Objective-C 2.0 的垃圾收集

      Objective-C 2.0最大的增强可能就是垃圾收集了(Garbage Collection).与“垃圾收集”对应的是传统的引用计数(Reference Count)内存管理形式. 使用了垃圾 ...

  2. vue-one_demo_music

    简单的音乐盒子 利用计算属性(监听数据),解决上一首,下一首,点击切换 <!DOCTYPE html> <html lang="en"> <head& ...

  3. 如何将局域网中的 windows 硬盘挂载到 linux 系统中

    1.共享windows上的E盘 2.linux上执行 mount //192.168.3.181/e /tmp/test -o username=dell,,password=abcdef 3.保证两 ...

  4. Linux OpenCV 静态链接错误

    错误一: undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' ...

  5. HihoCoder 1063 : 缩地 树形DP第二题(对象 边)

    时间限制:12000ms 单点时限:1000ms 内存限制:256MB 描述 编织者是 Dota 系列中的一个伪核,拥有很强的生存能力和线上消耗能力.编织者的代表性技能是缩地.缩地带来的隐身.极限移动 ...

  6. appium python实例脚本1

    #coding=utf-8import os, time, unittestfrom appium import webdriver PATH = lambda p:os.path.abspath(o ...

  7. hadoop常见错误总结三

    问题导读:1.... could only be replicated to 0 nodes, instead of 1 ...可能的原因是什么?2.Error: java.lang.NullPoin ...

  8. BZOJ4145 [AMPPZ2014]The Prices

    题意 你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j],求最小总费用. \(n \leq 100,m \leq 16\) 分析 ...

  9. ballerina 学习十 streams

    ballerina 的streams 使用的是siddhi complex event processing 引擎处理,可以包含的语法有 projection filtering windows jo ...

  10. Ubuntu 破解密码及用户管理

    Ubuntu 破解密码及用户管理 ubuntu 16.04 破解密码 useradd 实现以下要求 1.ubuntu16.04破解密码 2.创建下面的用户.组和组成员关系 名字为xipudata 的组 ...