黑马程序员技术交流社区

标题: HashMap中存入对象,保证唯一性的问题 [打印本页]

作者: 李晓斌    时间: 2012-2-8 18:53
标题: HashMap中存入对象,保证唯一性的问题
本帖最后由 李晓斌 于 2012-2-9 14:03 编辑

为什么往HashMap中存入对象,保证唯一性,要复写到HashSet中的hashCode和equals方法,另外,还要实现TreeSet中的Comparable接口呢?
作者: 最初的理想    时间: 2012-2-8 19:06
把对象放入hashmap中为什么要重写对象的equals和hashcode请搜素本版帖子,这类问题太多高手都给了你解答。另外,还要实现TreeSet中的Comparable接口呢?treeset集合中的元素是有顺序的,要么给treeset指定一个比较器,要么放入其中的对象实现一个比较接口以便能够进行比较,一般实现comparable接口按照自然顺序进行比较。
作者: 李晓斌    时间: 2012-2-8 19:08
最初的理想 发表于 2012-2-8 19:06
把对象放入hashmap中为什么要重写对象的equals和hashcode请搜素本版帖子,这类问题太多高手都给了你解答。 ...

但是,是把对象存进HashMap的集合中的,怎么会和TreeSet扯上关系呢?
作者: 秦碧    时间: 2012-2-8 19:28
李晓斌 发表于 2012-2-8 19:08
但是,是把对象存进HashMap的集合中的,怎么会和TreeSet扯上关系呢?

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

所以还是实现下Comparable吧
作者: 余海龙    时间: 2012-2-8 20:00
HashMap: 是可以存放空键空值的集合, 线程不安全的。

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

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

TreeSet: 有序且保证对象的唯一,往该集合中添加元素时,要么添加的对象实现Comparable接口,并覆盖其中的compareTo方法,使添加的元素具备比较性,要么使该集合具备比较性,即创建以个比较器,即实现Comparetor接口并复写接口中的compare方法。往TreeSet集合中添加元素时,会调用compare或compareTo方法。
作者: 易伟    时间: 2012-2-8 22:01
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接口,得到自己的比较器,然后把该比较器当做参数传递。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2