`
edr_
  • 浏览: 165827 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hashcode的作用

    博客分类:
  • J2SE
阅读更多
关于Hashcode的作用
  总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
       要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一 次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它 就要调用1000次equals方法。这显然会大大降低效率。
       于是,Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以 直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了;不相同,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。所以这里存在一个冲突解决的问题(很少出现)。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
       所以,Java对于eqauls方法和hashCode方法是这样规定的:
           1、如果两个对象相等,那么它们的hashCode值一定要相等;
           2、如果两个对象的hashCode相等,它们并不一定相等。
上面说的对象相等指的是用eqauls方法比较。

============================================================
如何理解hashCode的作用:
============================================================
以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:
1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。
2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equal.

============================================================  
改写equals时总是要改写hashCode
============================================================
java.lang.Object中对hashCode的约定:

   1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
   2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
   3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。
package test.set;

import java.util.*;

class V {
	int i;
	public V(int i) {
		this.i = i;
	}
	public int getI() {
		return this.i;
	}
	public boolean equals(Object o) {
		V v = (V) o;
		System.out.print("hashcode相同的,然后才执行的equals()方法的!");
		System.out.println(v.getI() == this.i);
		return v.getI() == this.i;
	}
	//如果不重写,将会产生不同的hashcode,所以可以加进set里面
	public int hashCode() {
		System.out.println("先执行hashCode()方法的!");
		return i;
	}
}

public class Test {
	public static void main(String[] args) {
		HashSet set = new HashSet();
		for(int i=0; i<10; i++)
		set.add(new String("test"));//默认重写equals().hashcode()
									//产生相同的hashcode,而且equals返回true所以不加进去;
		System.out.println(set.size());
		set.clear();
		
		for (int i = 0; i < 10; i++) {
			set.add(new V(1));
		}
		System.out.println(set.size());
	}
}

里面很多话都是参考其他博客,具体可以参考这篇文章,讲得很详细,有点长:
Hashcode的作用:http://blog.csdn.net/chinayuan/article/details/3345559
分享到:
评论
2 楼 edr_ 2014-03-02  
baungham 写道

thanks....一起学习
1 楼 baungham 2014-02-28  

相关推荐

    HashCode作用_动力节点Java学院整理

    Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。...hashCode提供了解决方案。怎么实现?我们先看hashCode的源码(Object)。

    Java 中HashCode作用_动力节点Java学院整理

    主要介绍了Java 中HashCode作用以及hashcode对于一个对象的重要性,对java中hashcode的作用相关知识感兴趣的朋友一起学习吧

    hashcode的作用

    hashcode的作用.doc hashcode的作用.doc hashcode的作用.doc

    java中Hashcode的作用.docx

    java中Hashcode的作用

    hashCode的作用

    1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0 1 2 3 4 5 6 7 而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode...

    Java中hashCode的作用

    以下是关于HashCode的官方文档定义:  hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。  hashCode 的常规协定是:  在Java应用程序执行期间...

    PPT浅析hashcode

    PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的

    java中hashcode()和equals()和==的详解

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...

    hashcode和equals的分析

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。 

    Penglq#book-1#Hashmap的hashcode的作用等1

    1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有例如内存中有这样的位置而我有个类,这个类有个字段叫ID,我要把这个类存放在以

    浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:  public native int hashCode();...在Java中也一样,hashCode方法的主要作用是为了配合基于

    浅谈Java中的hashcode方法(推荐)

    本篇文章主要介绍了Java中的hashcode方法,详细的介绍了hashCode方法的作用,具有一定的参考价值,有需要的可以了解一下。

    Java提高篇之hashCode

     hashCode的作用  要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也是这个方法的作用。在讲解数组时(java提高篇(十八)——数组),我们提到数组是java中效率高的数据结构,但是“高”是有前提...

    详解Java中hashCode的作用

    主要介绍了详解Java中hashCode的作用的相关资料,需要的朋友可以参考下

    Java hashCode() 方法详细解读

    Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色,本文对hashCode()方法深入理解,希望能帮助大家

    hashCode方法的使用讲解

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。

    浅谈Java中hashCode的正确求值方法

    主要介绍了浅谈Java中hashCode的正确求值方法,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    内容概要 这个源码资源是关于Java中的Object类的讲解案例...理解Object类的作用和重要性。 理解equals()、hashCode()、toString()等常用方法的用途。 学会正确重写这些方法,以满足特定需求。应用实例代码中提供的场

    Java equals 方法与hashcode 方法的深入解析

    面试时经常会问起字符串比较相关的问题,比如:字符串比较时用的什么方法,内部实现如何?hashcode的作用,以及重写equal方法,为什么要重写hashcode方法?以下就为大家解答,需要的朋友可以参考下

    Java中的hashcode方法介绍

    主要介绍了Java中的hashcode方法介绍,还是比较不错的,这里分享给大家,供需要的朋友参考。

Global site tag (gtag.js) - Google Analytics