- 浏览: 3460142 次
- 性别:
- 来自: China
文章分类
- 全部博客 (536)
- ajax (1)
- Algorithm (14)
- Android (40)
- CSS/HTML... (2)
- defy (3)
- DesignPattern (2)
- dorado (0)
- Drools (6)
- English/日本語 (7)
- Flex (2)
- Framework (0)
- Google (3)
- hibernate (13)
- homework (3)
- HTML5 (0)
- IDE (29)
- java (45)
- javaee (7)
- Javascript (14)
- java组件 (5)
- jQuery (4)
- jsp (8)
- jsf (2)
- Linux (2)
- lucene (0)
- mysql (6)
- news (3)
- Oracle (8)
- other (4)
- PHP (5)
- Python (0)
- Software Engineering (3)
- spring (7)
- struts1.x (14)
- struts2.x (14)
- strolling in cloud (1)
- subject:javaEnhance (20)
- Tomcat (7)
- validator (3)
- 学习·方法·心得 (8)
- .NET (2)
- vba (6)
- groovy (5)
- grails (2)
- SWT (0)
- big data (1)
- perl (1)
- objective-c (50)
- product (1)
- mac (7)
- ios (188)
- ios-phone (2)
- ios-system (15)
- ios-network (5)
- ios-file (4)
- ios-db (1)
- ios-media (3)
- ios-ui (27)
- ios-openSource (6)
- ios-animation (5)
- ios-drawing (7)
- c (2)
- ios-app (2)
- ios-course (15)
- ios-runtime (14)
- ios-code (8)
- ios-thread (8)
- ios-LBS (2)
- ios-issue (1)
- ios-design (2)
- Jailbreak (2)
- cocos2d (0)
- swift (16)
- ios-framework (4)
- apple watch (4)
- ios-web (1)
- react native (3)
- TVOS (1)
- OpenGL (1)
最新评论
-
xiaobinggg:
...
Session机制详解 -
菜鸟学生会:
Drools规则工作流引擎开发教程网盘地址:http://pa ...
Drools入门-----------环境搭建,分析Helloworld -
wangyudong:
不是很好用,不支持自动化测试RESTful API,也不支持自 ...
Simple REST Client POST使用方法 -
Paul0523:
很棒的一篇文章,感谢楼主分享
Session机制详解 -
啸笑天:
获取原型对象的三种方法<script>functi ...
复习JavaScript面向对象技术
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的hashCode方法,但是为他提供一个hashCode方法也不会有什么不好,没准以后什么时候有用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同时覆盖。
//HashSet比较时hashCode方法和equals方法都用了
HashSet:采用哈希算法的集合。实现了Collection接口,只能存入不同HashCode对象,即只存入不同的对象,如果希望存入具有相同内容的两个对象,则需覆盖对象的HashCode和 equals方法。
提示
(1)通常情况,自己编程时要做到:一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希吗也必须相等,但反之则不成立,即equals方法比较的结果不相等的对象可以有相等的哈希吗或者说哈希吗相等的两个对象的equals方法的比较的结果可以不相等。因为默认的equals方法比较的是hashcoad值。例如,字符串”BB”和”Aa”的hashCode的结果相等,但equals的结果不相等。
(2)当一个对象被存储进HashSet集合中以后,就不能修改这个歌对象中的那些参与计算哈希值的字段,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前的引用作为参数区HsahSet集合中检索对象,也将返回找不到对象的结果,这也是导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
例子:
package cn.zyj26.review; public class ReflectPoint { private int x; public int y; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ReflectPoint other = (ReflectPoint) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } }
package cn.zyj26.review; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class ReflectTest2 { public static void main(String[] args) throws Exception{ Collection<ReflectPoint> collections=new ArrayList<ReflectPoint>(); ReflectPoint pt1 = new ReflectPoint(1,1); ReflectPoint pt2 = new ReflectPoint(2,2); ReflectPoint pt3 = new ReflectPoint(1,1);//默认的equals方法比较的是hashcoad值,所以pt3与pt1不相等,要相等必须重写equals方法 collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt1); System.out.println(collections.size());//4 Collection<ReflectPoint> collectionsH=new HashSet<ReflectPoint>(); collectionsH.add(pt1); collectionsH.add(pt2); collectionsH.add(pt3); collectionsH.add(pt1);//3,重写equals可以得到结果2 System.out.println(collectionsH.contains(pt1));//true pt1.y=22;//导致哈希值改变了!!这样也无法删除了,即collectionsH.remove(pt1);无效了 System.out.println(collectionsH.contains(pt1));//false System.out.println(collectionsH.size()); } }
Ps:
解释equals(),hashcode()和== http://justsee.iteye.com/blog/1317565
发表评论
-
43 通过反射获得泛型的实际类型参数
2011-12-24 00:01 1932public static void applyV ... -
42 自定义泛型类的应用
2011-12-23 09:50 1632l 如果类的实例对 ... -
40 自定义泛型方法及其应用41 自定义泛型方法的练习与类型推断总结
2011-12-23 09:49 164240 自定义泛型方法及其应用 l <!--[e ... -
38 泛型的通配符扩展应用39 泛型集合的综合应用案例
2011-12-23 09:49 124738 泛型的通配符扩展应用 泛型中的?通配符: l问 ... -
36 入门泛型的基本应用37 泛型的内部原理及更深应用
2011-12-23 09:49 117936 入门泛型的基本应用 <!--[if !su ... -
33了解和入门注解的应用34 注解的定义与反射调用35为注解增加各种属性
2011-12-23 09:49 163333 了解和入门注解 ... -
32 使用BeanUtils工具包操作JavaBean
2011-12-22 10:02 1534Beanutils工具包: l 演示用eclipse ... -
30-31内省访问JavaBean属性的两种方法
2011-12-22 10:02 223930 对JavaBean的简单内省操作 //pt ... -
29 由内省引出JavaBean的讲解
2011-12-22 10:02 1392IntroSpector内省—> ... -
28 用类加载器的方式管理资源和配置文件
2011-12-22 10:01 1523/*getRealPath();//金山词霸/内部 ... -
27框架的概念及用反射技术开发框架的原理
2011-12-21 09:38 1136反射的作用à实现框架功能 *框架与框架要解决的 ... -
解释equals(),hashcode()和==
2011-12-21 09:38 1604简单的结论:当对象类没有不符合规范的override e ... -
23对接收数组参数的成员方法进行反射24 数组与Object的关系及其反射类型25 数组的反射应用
2011-12-21 09:37 128223对接收数组参数的成员方法进行反射 packa ... -
18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射
2011-12-21 09:37 151918 理解反射的概念 反射 一、反射就是Java类中 ... -
17 透彻分析反射的基础_Class类
2011-12-20 11:16 1403Java类用于描述一类事物的共性,该类事物有什么属性,没 ... -
12-16 jdk5枚举
2011-12-20 10:55 1290模拟枚举,其实枚举编译后就是如此: pac ... -
11 jdk5基本数据类型的自动拆箱与装箱
2011-12-20 10:36 1623package cn.zyj11.revie ... -
09jdk5可变参数与OverLoad;10java5的增加for循环
2011-12-20 10:34 1373package cn.zyj0910.review ... -
08 jdk5的静态导入
2011-12-20 10:31 1224import语句可以导入一个类或某个包中的所有类 im ...
相关推荐
本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...
1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。 2. 如果两个对象根据equals(Object o)方法是相等的,...
- 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...
Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...
同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...
_注意_:当数据元素是实体类时,需要额外重写_equals_()和_hashCode_()方法,以便正确地比较对象的相等性。例如,以学号为依据判断重复: ```java public class Student { String id; String name; int age; ...
【栈和队列的特点】 ...由于HashSet不允许重复元素,所以重复的元素在添加过程中会被自动过滤掉,最后得到的HashSet中元素即为ArrayList去重后的结果。这个过程通常比直接在ArrayList中操作要高效。
为了实现元素的唯一性,`HashSet`会调用元素的`hashCode()`和`equals()`方法来确定元素是否重复。因此,为了使`HashSet`正常工作,加入其中的对象必须正确实现这两个方法。 - **TreeSet**:实现了`SortedSet`接口,...
\n - **HashSet存储自定义元素**:HashSet可以存储任何类型的对象,包括自定义对象,但要求对象必须实现`hashCode()`和`equals()`方法,以便于计算哈希码并判断元素唯一性。\n\n4. **判断集合元素唯一性原理**\n 在...
在日常开发中,ArrayList、HashSet和HashMap是最常用的集合类型。ArrayList提供了快速的随机访问,适用于大部分情况;HashSet提供了快速查找和去重功能;HashMap则通过键的哈希值实现快速查找。在多线程环境下,需...
- 集合框架包括了多个接口(如Collection、List、Set、Map)、类(如ArrayList、HashSet、HashMap)以及相关的算法。 2. **集合和数组的区别**: - 数组是固定大小的,存储同类型的元素,而集合的大小可变,可以...
在使用 HashSet 存储自定义元素时,必须确保类正确实现了 equals() 和 hashCode() 方法,因为这是判断元素唯一性的基础。如果类没有重写这两个方法,将使用默认的 Object 类的实现,可能导致无法正确区分不同对象,...
HashSet通过比较元素的hashcode和equals()方法来检测重复项。HashMap则是一个存储键值对的结构,不保证顺序,允许键或值为null。 HashMap和ConcurrentHashMap的主要差异在于线程安全性和设计。ConcurrentHashMap...
HashSet相比于其他集合类,如ArrayList或LinkedList,具有查找速度快的优点,因为它基于哈希表的数据结构,平均时间复杂度为O(1)。然而,它不保证元素的顺序,如果你需要保持元素插入的顺序,可以考虑使用...
equals方法用于比较两个对象是否相同,而hashCode方法用于计算对象的哈希码值。 例如,假设我们有一个Student类,想要去重Student对象列表。首先,我们需要重写Student类的equals和hashCode方法。 ```java public ...
因此,为了使HashSet能正确工作,存储的元素必须正确实现hashCode()和equals()方法。 Java的HashMap是基于开放寻址法和链地址法的混合实现,它使用负载因子(默认为0.75)来决定何时进行扩容。当元素数量达到当前...
3. **HashSet, ArrayList和HashCode原理分析**:本章深入讨论集合框架,理解`HashSet`和`ArrayList`的存储机制,以及`hashCode()`方法在对象存储和比较中的关键作用。 4. **内省和JavaBean原理分析**:内省是Java中...
为了使Person对象能在HashSet中正确工作,我们需要重写`hashCode()`和`equals()`方法,确保当两个Person对象的姓名和身份证号都相等时,它们被视为相等。然后,我们使用Iterator遍历HashSet并打印元素。 接着,我们...
6. **ArrayList与HashSet的比较**:`ArrayList`是有序且可重复的,它按照元素插入的顺序存储数据。而`HashSet`是无序且不可重复的。在插入元素时,`HashSet`会检查元素的`hashCode`,以确定其存储位置,从而快速查找...