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

© houyudong 中级黑马   /  2014-6-28 19:50  /  1218 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在看Set集合的时候,有点不解。Set无序不重复。(无序是指添加元素时的顺序,没有索引)
HashSet利用HashCode和equals来比较两个对象是否相等,如果HashCode不相等,直接添加到集合中,如果HashSet相等,就判断equals是否相等,equals相等说明是重复的,不添加,否则就添加,
问:
   在进行HashCode和equals比较以后存入HashSet中,他是随便存放还是按照HashCode值的大小进行存放的呢?
TreeSet又称为定制排序,利用对象自身实现comparable接口实现comparTo方法,来对两个对象进行判断是否重复,在按照comparTo方法返回值判定对象的存储位置,是有序的。
问:
  TreeSer感觉在存储时只能存储同一种类型的元素,否则会报类型转换异常,如果要存储其他类型的元素就应该重新创建一个新的TreeSet对象?这句话对吗?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

4 个回复

倒序浏览
怎么没有人回答我的问题?
回复 使用道具 举报
问题1:在进行HashCode和equals比较以后存入HashSet中,他是随便存放还是按照HashCode值的大小进行存放的呢?
答:是按照HashCode来存放的,至于是不是大小,不清楚。莫须是……


问题2:TreeSer感觉在存储时只能存储同一种类型的元素,否则会报类型转换异常,如果要存储其他类型的元素就应该重新创建一个新的TreeSet对象?这句话对吗?
答:在new TreeSet时,如果用了泛型,那肯定只能存储同一种类型的元素。如果不使用,那也只能存一种……试了几次,都报ClassCastException,有大神说一下原因么?
回复 使用道具 举报
wisely 发表于 2014-6-30 19:49
问题1:在进行HashCode和equals比较以后存入HashSet中,他是随便存放还是按照HashCode值的大小进行存放的呢 ...

HashSet不是按照hashcode存放的把,比如你只存几个字母他的存储结果是乱序的,而不是按照hashcode存放的
回复 使用道具 举报
houyudong 发表于 2014-6-30 21:26
HashSet不是按照hashcode存放的把,比如你只存几个字母他的存储结果是乱序的,而不是按照hashcode存放的 ...

HashSet<class> ,在调用add()方法后,它的底层会首先调用所添加对象(也就是前面尖括号中的class),然后再调用所添加对象的equals()方法。

单个字母就是字符型,查询一下Character类,就会发现它复写了Object根类中的hashCode()方法和equals()方法。其他包装类,如Integer,String等包装类都有自己的hashCode()和equals()方法。

如果是自建class的话,那么就需要复写这两个方法,否则,因为所有类都有一个根类,Object,它里面有hashCode()和equals(),如果不复写,就会直接继承这两个方法,先是hashCode()方法,然后是euqals()方法。一般来说,new出来的对象,如果不复写hashCode()方法,那么必定每一个都不相同,这样就失去了HashSet的作用(元素不重复)。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

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