leochiang

BlogJava 联系 聚合 管理
  21 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks
      首先,hashCode就是一种查找的索引值。就好比一个数组,你用数组下标来查找你的数组元素,同样,hashCode来查找hashTable中的存储元素。当然,作为散列方式的查找和存储,要比数组这种线性数据结构复杂的多。这涉及到hash函数的构造, hash   Collision等问题,数据结构中。
而每个对象在内存当中的存储组织方式就是利用这种散列方式存储,当然也就有它的 hashCode了,如果想获取这个对象在Hash表中的位置,就可以调用 Object.hashCode() 结果返回int型。还有一点需要注意的是:hashcode   相等,则对象一定一样;hashcode   不相等,对象 也可能相等(不是相同),   如果对于不等的对象构造不同的hashCode那么将会提高 hash表的性能。(具体原因可以查看数据结构中hash表的构造方式)     
       下面的两个程序是hashcode的理解:
 student.java
package core_java;

public class Student {
    private String name;
    private int age;
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    public int hashCode(){
        return 7*name.hashCode()+13*age;
    }

}
在同一个包下 Testhashcode.java
package core_java;

public class Testhashcode {

    /**
     * 
@param args
     
*/
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Student stu1 = new Student("aa",17);
        Student stu2 = new Student("aa",17);
        
        System.out.println(stu1);
        System.out.println(stu2);
        
        System.out.println(stu1 == stu2);

    }

}
得出的结果:
core_java.Student@55bd
core_java.Student@55bd
false
说明:1.system.out.println(Object)输出的是Object.toString(),Student类重写了hashcode方法,如果不重写则结果不一样
        2.== 比较的不仅仅是对象在虚拟机中的内存地址
        深入了解hashcode与内存分配:

HashCodeMeaning.java

package com.leo.test.action;


import java.util.ArrayList;

/**
 * 
@author      MK
 *
 * 此方法的作用是证明 java.lang.Object的hashcode 不是代表 对象所在内存地址。
 * 我产生了10000个对象,这10000个对象在内存中是不同的地址,但是实际上这10000个对象
 * 的hashcode的是完全可能相同的
 
*/
public class HashCodeMeaning {
    public static void main(String[] args) {
        ArrayList list =  new ArrayList();
        int numberExist=0;
        
        //证明hashcode的值不是内存地址
        for (int i = 0; i < 10000; i++) {
            Object obj=new Object();
            if (list.contains(obj.toString())) {
                System.out.println(obj.toString() +"  exists in the list. "+ i);
                numberExist++;
            }
            else {
                list.add(obj.toString());
            }
        }
        
        System.out.println("repetition number:"+numberExist);
        System.out.println("list size:"+list.size());
        
        //证明内存地址是不同的。
        numberExist=0;
        list.clear();
        for (int i = 0; i < 10000; i++) {
            Object obj=new Object();
            if (list.contains(obj)) {
                System.out.println(obj +"  exists in the list. "+ i);
                numberExist++;
            }
            else {
                list.add(obj);
            }
        }
        
        System.out.println("repetition number:"+numberExist);
        System.out.println("list size:"+list.size());
    }
}
运行输出结果:

java.lang.Object@922804  exists in the list. 1778
java.lang.Object@e29820  exists in the list. 2077
repetition number:2
list size:9998
repetition number:0
list size:10000

说明:
存入hashcode到list中时不同对象的hashcode有可能相等,而不同对象的内存地址是不相等的

现在脑子里还有点混乱  需要深刻理解下。
哪位可以给我点详细的资料啊?

补充:

如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。




























posted on 2012-08-01 18:37 leoChiang 阅读(4348) 评论(1)  编辑  收藏 所属分类: 技术文档

Feedback

# re: java中的hashcode与内存地址与“==” 2014-04-07 12:11 chenssy
HashCodeMeaning.java这个类的方法我运行了好多遍numberExist值总是0。兄弟你是否真的运行过该例子  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: