equals测试:
1:查看源码发现,继承Object中的equals方法时,比较的是两个引用是否指向同一个对象
2:子类可以通过重写equals方法的形式,改变比较内容(比如String 中的equals方法)
哈希码
在Java中,哈希码代表了对象的一种特征,例如我们判断某两个字符串是否==,如果其哈希码相等,则这两个字符串是相等的。其次,哈希码是一种数据结构的算法。常见的哈希码的算法有:
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
public boolean equals(Object obj) {
return (this == obj);
}
java 中对象的哈希码值是指的什么?
就是对象在JVM虚拟出来的内存地址。不是实际物理内存地址。
http://bbs.itheima.com/forum.php?mod=viewthread&tid=55162 哈希码值和对象的内存地址值有何关系? class Test { public int hashCode() { return 60; } } class Demo { public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); System.out.println("t1="+t1+"...t2="+t2); System.out.println(t1==t2); } } 打印出来的结果是: t1=Test@3c...t2=Test@3c false 这是什么意思?我以为t1和t2的哈希码值相同,也就代表它们在内存中的地址值相同,所以它们是同一个对象,但t1==t2结果却是false,这样看来这俩对象在内存中的地址值是不一样的,那么 1.它们的地址值又是什么? 2.它们的地址值和它们的哈希码值有何关系? 3.Object 类中的equals比较的是否就是两个对象的地址值?
哈希值和内存地址 可能有一定的联系 但是没有必然的联系啊 这个涉及到计算机系统中的存储形式,如果是哈希存储形式 那么 这存储地址会根据哈希值 再有一些规则算出存储地址 如果哈希值相同 还会有解决哈希值冲突的机制 如果有兴趣的话 可以去对该知识点的研究一下 欢迎分享 研究成果!!
嗯嗯,刘大版主说的很有道理,我刚刚去搜索了一下,对这几个问题有点点稍深入的了解了:
1.对象的哈希码值和内存地址值不是一回事;
2.如果自定义类不复写hashCode方法,那么该方法返回的哈希码值,应该就是对象的内存地址值,如果复写了hashCode方法,那么此时对象的哈希码值就不是它的内存地址值了;
3.如果自定义类不复写Object类中的equals方法,那么equals比较的就是两个对象的内存地址值。
对哈希码值和内存地址值有点明了了,
看Object类中的hashcode的源码 public native int hashCode(); 知道这是一本地方法,也就是说当new一个对象的时候,都会有一个hash码,计算hash码用到相应的hash算法,我个人认为之所以hashcode()方法是一个本地方法,是应为java中的对象的hash码的得出是通过本地系统提供的hash算法(个人理解,有误请指正),还有java中 对象的hashcode并不是指对象的物理地址。你复写hashcode方法后,就是说对象的hashcode是按你写的方法来计算而已,在楼主的程序中你是new了两个对象,所以内存地址肯定是不一样的,但是在你定义的类中复写里hashcode方法,而且是返回一个确定的值,所以他们hash码肯定是一致的。
public final class System extends Object
- Parameters:
x
- object for which the hashCode is to be calculated- Returns:
- the hashCode
- Since:
- 1.1
- See Also:
Object.hashCode()
,Objects.hashCode(Object)