Java(3-3)

①hashCode:
散列码(hashcode)是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashcode()和y.hashcode()基本上不会相同。
下面给出通过调用String类的hashcode方法得到的散列码:

int hash = 0;
for(int i = 0;i < length(); i++)
    hash = 31 * hash + charAt(i);

由于hashcode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址,证据如下:

String s = "ok";
StringBulider sb = new Stringulider(s);
System.out.println(s.hashCode() + " " + sb.hashCode() );
String t = new String("OK");
StringBulider tb = new StringBulider(t);
System.out.println(t.hashCode() + " " + tb.hashCode());

对象 散列码
s 2556
sb 20526976
t 2556
tb 20527144

好了,你会看见s和t的散列码是一样的,别急,听我解释。字符串s和t拥有相同的散列码,这是因为字符串的散列码是内容导出的!而字符串缓冲sb和tb却有着不同的散列码,这是因为在StringBuffer类中没有定义hashCode方法,它的散列码是由Object类的默认hashCode方法导出的对象存储地址。

如果重新定义了equals方法,就必须!必须!重新定义hashCode方法,以便用户可以将对象插入散列表中
因为,如果equals方法判断相等后,那hashCode()方法如果不重写,两个对象地址值肯定不一样,hashCode方法返回的整型数值也会不一样,那用hashmap,hashtable存储数据时,可能就造成内容一样,存储两次。

hashCode方法应该返回一个整型数值(也可以是负数),并合理地组合实例域的散列码,以便能够让各个对象产生的散列码更加均匀。
例如:

public class Employee
{
    public int hashcode()
    {
        return 7 * name.hashCode() // String的散列码
                + 11 * Dobule.hashCode(salary) //用了一个Double的静态方法
    }
}
//还有种更好的方法要介绍,需要组合多个散列值时,可以调用Object.hash并提
//供多个参数,这样可以组合这些散列值。
pubic int hashCode()
{
    return Object.hash(name,salary,hireDay);
}

下面介绍Object中的另外一个重要的方法,就是toString方法,他用于返回表示对象值的字符串。
绝大多数(不是全部)的toString方法都遵循这样的格式:类的名字,随后是一对方括号括起来的域值,但实际上,我们还可以设计的更好一些。最好通过调用getClass().getName()获得类名的字符串,而不要将类名硬加到toString方法中。

public String toString()
{
    return getClass().getName()
    +"[name=" +name ....+ "]";
}

toString方法也可供子类调用,但是,设计子类的程序员也应该定义自己的toString方法,并将子类域的描述添加进去。如果超类使用了getClass().getName(),那么子类只要调用super.toString()就可以了。例如:

public class Manager extands Employee
{
    ...
    public String toString()
    {
        return super.toString()
        +"[bonus="+bonus+"]";
    }
}

这个toString方法真是是随处可见,这是因为,只要对象与一个字符串通过操作符‘+’连接起来,java编译就会自动的调用toString方法,以便获得这个对象的字符串描述。 所以 x.toString 也可以换成 “” + x ,与toSting不同的是,如果x是基本类型,这个用法照样执行。

数组可以通过调用静态方法Array.toString(数组名)来返回字符串,强烈建议为自定义的每一个类增加toString()方法!受益匪浅!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值