A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓斌 黑马帝   /  2012-2-8 18:53  /  2626 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李晓斌 于 2012-2-9 14:03 编辑

为什么往HashMap中存入对象,保证唯一性,要复写到HashSet中的hashCode和equals方法,另外,还要实现TreeSet中的Comparable接口呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

5 个回复

倒序浏览
把对象放入hashmap中为什么要重写对象的equals和hashcode请搜素本版帖子,这类问题太多高手都给了你解答。另外,还要实现TreeSet中的Comparable接口呢?treeset集合中的元素是有顺序的,要么给treeset指定一个比较器,要么放入其中的对象实现一个比较接口以便能够进行比较,一般实现comparable接口按照自然顺序进行比较。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
最初的理想 发表于 2012-2-8 19:06
把对象放入hashmap中为什么要重写对象的equals和hashcode请搜素本版帖子,这类问题太多高手都给了你解答。 ...

但是,是把对象存进HashMap的集合中的,怎么会和TreeSet扯上关系呢?
回复 使用道具 举报
李晓斌 发表于 2012-2-8 19:08
但是,是把对象存进HashMap的集合中的,怎么会和TreeSet扯上关系呢?

写程序的时候要考虑其扩展性啊
如果只复写了其equals和hashcode方法 就将其封装
以后就无法使用使用TreeSet来操作该类的对象了

所以还是实现下Comparable吧

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
HashMap: 是可以存放空键空值的集合, 线程不安全的。

HashCode:不能存放空间空值的集合,线程是安全的。

HashSet: 任何对象存储到HashSet集合都必须复写Object类中的hashCode()和equals方法,因为为了保证集合中元素的唯一性,需要调用对象中的这两个方法进行比较。如果比较的结果相同则不能存放到该集合中。

TreeSet: 有序且保证对象的唯一,往该集合中添加元素时,要么添加的对象实现Comparable接口,并覆盖其中的compareTo方法,使添加的元素具备比较性,要么使该集合具备比较性,即创建以个比较器,即实现Comparetor接口并复写接口中的compare方法。往TreeSet集合中添加元素时,会调用compare或compareTo方法。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
java的集合框架大致分为list、set、map,你说的hashmap和hashset都是用哈希算法计算存储位置和查找位置。
HashMap使用哈希算法来计算对象存放的区域,之所以要复写hashCode和equals方法是因为:Object中的equals方法默认和==相同,默认比较的地址值。
举个例子:Person  a = new Person ("abc")    Person  b = new Person ("abc") ,如果person类中没有覆盖equals方法,那么a.equals(b)的结果将返回false。
所以对两个内容相同的对象,应该根据需要覆盖equals方法。复写hashCode是为了让它与equals有相同的比较结果,即两个对象equals比较相等,那么他们的
hashCode值也应该相等。
排序分为自然排序和自定义比较器排序。java中有两种实现;1:比较的对象的类必须实现comparable接口,那么该类的对象就能够进行比较,
2:实现Comparator接口,得到自己的比较器,然后把该比较器当做参数传递。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马