`
yaqi0628
  • 浏览: 6451 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
最近访客 更多访客>>
社区版块
存档分类
最新评论

equals and hashcode

阅读更多


import java.util.ArrayList;
import java.util.Collection;


/**
 * ArrayList_HashSet 的比较及Hashcode分析
 * @author yaqi
 * @date 2012/06/28
 *
 */
public class ReflectTest2 {

	public static void main(String[] args) {
		Collection col = new ArrayList();
		ReflectPoint pt1 = new ReflectPoint(3, 3);
		ReflectPoint pt2 = new ReflectPoint(5, 5);
		ReflectPoint pt3 = new ReflectPoint(3, 3);
		col.add(pt1);
		col.add(pt2);
		col.add(pt3);
		col.add(pt1);
/**
 * ArrayList 是一个有顺序的集合,按顺序依次将引用对象放入到集合.每一个对象都会有自己的位置
 * 
 * HashSet  是一个无序的集合,在放入对象之前 ,它会检查此对象是否已在这个集合中存在,若存在,则不放.
 * 
 */
	}
	
	
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}
	
/**
 * equals()方法的作用:
 *   
 *   逐一取出每个元素与要查找的对象进行比较,当发现某个元素与要查找的
 *   对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的
 *   信息,否则,返回否定的信息.
 *   
 *   重写了这个方法,则只要对象里的值相等则认为是同一个对象
 */
	
/**
 * Hashcode()方法的作用:
 * 
 * 	  HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n
 * 进行取余的方式对哈希码进行分组和划分对象的存储区域.Object类中定义
 * 了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet
 * 集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得
 * 该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的
 * 每个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素
 * 就可以得到结论.可见,HashSet集合具有很好的对象检索性能.但是,
 * HashSet集合存储对象的效率相对要低些.因为向HashSet集合中添加一个对象是地,要
 * 先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置.
 *   
 *   为了保证一个类的实例对象能在HashSet正常存储,要求这个类的两个实例对象用
 * equals()方法细弱的结果相等时,<b>它们的哈希码也必须相等</b>,也就是说:
 * 如果obj1.equals(obj2)的结果为true ,那么以下表达式的结果也要为true
 *            obj1.hashcode() == obj2.hashcode();
 *   
 *   如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用
 * equals()方法比较的结果相等时,它们本来为应该无法被同时存储进Set集合中,但是,
 * 如果将它们存储进HashSet集合中时,由于它们的hashCode()方法的返回值 不同,第
 * 二个对象首先按哈希码计算可能会被放进与第一个对象不同的区域中,这样,它就不可能与第一个
 * 对象进行equals方法比较了,也就可能被存储进HashSet集合中了.Object类中的
 * hashCode()方法不能满足对象疲存入到HashSet中的要求,因为它的返回值是通过对象
 * 的内存地址推算出来的,同一个对象在程序运行期间的任何时候返回的哈希值都是始终不变的.
 * 所以,只要是两个不同的实例对象,即使它们的equals方法比较结果相同 ,它们默认的
 * hashCode方法的返回值是不同的,只要将
 * 
 * <b>提示:</b>
 *  1.通常来说 ,一个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希
 *码也必须相等,但反之则不成立;即equals方法比较结果不相等的对象可以有相同的哈希码,
 *或者说哈希码相同的两个对象的equals方法比较的结果可以不相等,例如:
 *   字符串"BB"和"Aa"的equals方法比较结果肯定不相等,但它们的hashCode方法
 * 返回值却相等.
 * 
 *  2.当一个对象被存储进HashSet集合中以后 ,就不能修改这个对象中的那些参与计算哈
 *希值的字段了,否则 ,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了
 *在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中
 *检索对象.也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象
 *从而造成内存泄露.
 */
	
	
}




分享到:
评论

相关推荐

    JDBC_sorting_Comparing_

    Java sorting objects with equals and hashcode override

    java 开发规范

    Object Model Violation: Just one of equals() and hashCode() Defined ABSTRACT This class overrides only one of equals() and hashCode().

    Generatable:可生成-Intellij IDEA插件

    可产生的可生成-Intellij IDEA插件插件向“生成”菜单添加了一些操作: Generate inner Builder classGenerate All: getters, equals and hashCode, toString, Constructor, Builder也可以看看: FuGen - You can ...

    Java教程补充材料

    10 The Methods in the Object Class (finalize, hashcode, clone, getClass, equals) 11 Hiding Data Fields and Static Methods 12 Initialization Blocks 13 Extended Discussions on Overriding Methods 14...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 11: Always override hashCode when you override equals Item 12: Always override toString Item 13: Override clone judiciously Item 14: Consider implementing Comparable 4 Classes and Interfaces Item...

    Hibernate Reference Documentation3.1

    4.3. Implementing equals() and hashCode() 4.4. Dynamic models 4.5. Tuplizers 5. Basic O/R Mapping 5.1. Mapping declaration 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. ...

    生成Eclipce的Java插件Jenerate.zip

    hashCode() and equals() toString() compareTo() 标签:Jenerate 分享 window._bd_share_config = { ...

    sesvc.exe 阿萨德

    * for keySet() and values(). */ transient Set,V&gt;&gt; entrySet; /** * The number of key-value mappings contained in this map. */ transient int size; 和 1.7 大体上都差不多,还是有几个重要的区别: ...

    java8源码-JavaInterview-5:java中高级面试指南

    hashcode相等两个类一定相等吗? equals 呢 相反呢? () 线程池用过么?都有哪些参数? 底层如何实现? () () () () () synchized和lock什么区别? 底层细节 () () () threadLocal是什么?底层如何实现?写一个例子 ...

    Hibernate3的帮助文档

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

    Hibernate参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...

    Hibernate 中文 html 帮助文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...

    hibernate 教程

    实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...

    hibernate

    实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...

    最全Hibernate 参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    hibernate 框架详解

    实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class ...

    Hibernate3+中文参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    Hibernate注释大全收藏

    //appropriate equals() and hashCode() implementation } @Embeddable public class FootballerPk implements Serializable { //same name and type as in Footballer public String getFirstname() { return ...

    hibernate3.04中文文档.chm

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. ...

    Hibernate教程

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

Global site tag (gtag.js) - Google Analytics