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集合中单独删除当前对象
*从而造成内存泄露.
*/
}
分享到:
相关推荐
Java sorting objects with equals and hashcode override
Object Model Violation: Just one of equals() and hashCode() Defined ABSTRACT This class overrides only one of equals() and hashCode().
可产生的可生成-Intellij IDEA插件插件向“生成”菜单添加了一些操作: Generate inner Builder classGenerate All: getters, equals and hashCode, toString, Constructor, Builder也可以看看: FuGen - You can ...
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...
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...
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. ...
hashCode() and equals() toString() compareTo() 标签:Jenerate 分享 window._bd_share_config = { ...
* for keySet() and values(). */ transient Set,V>> entrySet; /** * The number of key-value mappings contained in this map. */ transient int size; 和 1.7 大体上都差不多,还是有几个重要的区别: ...
hashcode相等两个类一定相等吗? equals 呢 相反呢? () 线程池用过么?都有哪些参数? 底层如何实现? () () () () () synchized和lock什么区别? 底层细节 () () () threadLocal是什么?底层如何实现?写一个例子 ...
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...
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. ...
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. ...
实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...
实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...
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 ...
实现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 ...
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 ...
//appropriate equals() and hashCode() implementation } @Embeddable public class FootballerPk implements Serializable { //same name and type as in Footballer public String getFirstname() { return ...
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. ...
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...