`

equals(Object obj);hashCode();toString();

JDK 
阅读更多
在JAVA中默认的2个方法,equals(Object obj)与hashCode();

首先:



hashCode()则是返回对象的散列码。

而toString()方法责是返回getClass().getName() + '@' + Integer.toHexString(hashCode())



比如有如下代码:

package com.generic;

public class Test<E> {
	
	private E name;
	
	Test(E setName){
		name=setName;
	}
	
	public void display(){
		System.out.println(name);
	}
	
}



package com.generic;

public class TestGeneric {
  public static void main(String[] args) {
  Test<String> t1=new Test<String>("Hello");

  System.out.println(t1.hashCode());
  System.out.println(t1.toString());
}
}


按道理来说,同一个对象的散列码应该是相同的,但是JDK的输入却是:

12677476
com.generic.Test@c17164

这里注意了,不要被假象所迷惑了,System.out.println(t1.toString());输出的是是getClass().getName() + '@' + Integer.toHexString(hashCode())这里的散列码被转型成了十六位进制来表示了。修改以上代码:

System.out.println(Integer.valueOf(t1.toString().substring(17),16).toString());


现在JDK输出:

33263331
33263331

散列码小补课:

在一个序列中查找一个特殊的对象所需要的时间取决于容器中对象的数量。如果我们没有对容器中元素进行排序,那么随着元素数量的增加,你所需要的查找时间也就直线增加了:如果容器中元素的数量增加了一倍,那么你用来查找一个特殊元素的时间也就增加了一倍。然而,如果我们对容器中的元素进行了排序,那么查找时间就是随着元素数量的对数而增加的了:要使查找一个元素的时间增加一倍,你必须使集合中的元素数量增加四倍。如果你用一个key来搜索对象,你可以用比序列式容器更好的方法来存储你的对象。你可以用哈希表(hash table)。我觉得哈希表作用就是快速搜索对象。
代码片断:
Hashtable hashtable = new Hashtable();//创建一个哈希表
            hashtable.Add("1", "11");//添加键名和值 hashtable.Add(键名, 值);键名是唯一的,不能重复。键名和值都可以是值类型,也可以是对象。
            hashtable.Add("2", "22");
            hashtable.Add("3", "33");
            hashtable.Add("4", "44");
            hashtable.Add("5", "55");
            hashtable.Add("6", "66");
            hashtable.Add("7", "77");

            string s = hashtable["1"].ToString();

s="11";

小补课内容来自:http://zhidao.baidu.com/question/37370523.html


在JAVA默认实现中,任何2个不同的对象都不是等价的,因为JAVA默认的equals(Object obj) 方法是根据散列码来判断的,2个不同对象的散列码不可能相同。所以,如果你要变换这种默认的方式,那么你必须手写满足自己要求的equals(Object obj)方法,不要去使用JAVA类库中自带的方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics