基于hashcode的内存分配与==的比较问题

[/code][code="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;

}
}
public class testHashcode
{
public static void main(String[] args)
{
student stu1=new student( "aa ",12);
student stu2=new student( "aa ",12);

//打印两个对象的内存地址
System.out.println(stu1);
System.out.println(stu2);

//打印两个对象内存地址的比较
System.out.println(stu1==stu2);
}
}


先看这个程序!!
这个程序证明内存的地址分配时基于hashcode分配的!!
把这个程序分别放在同包和不同包 并且测试下重写hashcode和不重写的打印结果
看结果

不同包 不 重写hashcode
test2.student@c17164
test2.student@1fb8ee3
false


同包 不重 写
test1.student@c17164
test1.student@1fb8ee3
false

同包 重写hashcode
test1.student@a489c
test1.student@a489c
false

可以看出 重写时 因为student设置的属性值都是一样的!所以返回的hashcode值也是相同的!所以返回的内存地址也是相同的!!
但我们还很怀疑!
那看下面的程序

public int hashCode()
{

//这里随便写,只要是按属性生成的即可
return 7*name.hashCode()+13*age+1;

}


改下 hashcode的返回数据
结果是什么呢??

同包 重写 hashcode 但在原有基础的hashcode +1
test1.student@a489d
test1.student@a489d
false

现在相信了吧!内存地址也比之前增加了1个单位!!
但这时两个对象还是不想同!!
所以==比较的不仅仅是内存地址啊!!

开始我是这么想的
再看下面
Object.toString的实现方法是
getClass().getName() + '@' + Integer.toHexString(hashCode())
实际上是Object的hashCode方法返回对象的地址。所以在需要得到内存地址的类到Object之间如果没有类对hashCode进行覆盖(override),就可以通过该方法得到对象的内存地址。反之就无法通过此方法得到内存地址。
我觉得应该可以通过某个函数来得到对象或变量的内存地址,但我们不能通过该地址来操作它所存储的内容。
也就是说 你打印的话 就是根据 hashcode打印!!打印的是Object.toString()
所以上面的结果就得出了打印结果相同!!
但其实 这时打印的不是内存地址了!!!
接着

System.out.println(Integer.toHexString( System.identityHashCode(stu1)));
System.out.println( Integer.toHexString(System.identityHashCode(stu2)));

打印出来的是hashcode的16进制字符串
[url]http://lz12366.iteye.com/admin/blogs/639969[/url]
这个介绍了hashcode的计算方法!!
文章讨论到了最后
看了很多人写的文章:还有think in java 中
都写到 System.out.println(Object);得到的是内存地址!!
前提是没有重写hashcode!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值