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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾辉 黑马帝   /  2012-2-13 16:27  /  2587 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中为什么List、HashSet允许存放空元素,TreeSet就不允许,为什么

评分

参与人数 2技术分 +2 收起 理由
唐秀启 + 1 赞一个!
admin + 1 问得好

查看全部评分

7 个回复

倒序浏览
1 List 集合: 被比较的对象要重写equals()办法, 调用List中contains()办法,便是用equals()办法比较的.                  


  List 集合 (允许重复元素,允许空值)

2 HashSet集合(不允许重复元素,允许空值): 被比较的对象要重写hashCode()办法和重写equals()办法, 两个全部要.

3 TreeSet集合.(不允许重复元素):

    办法一:被比较的对象(如学生类)实现Comparable接口,重写CompareTo()办法.--(不允许空值)

    办法二:TreeSet的构造办法,传入Comparator接口的实现类,他是重写了compare()办法.--(允许空值)

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
List类型里存放的元素是有先后顺序的,是个队列,并且该集合允许存放多个空元素,是个有效的序列。
它的每个元素都拥有有效的访问地址,所以允许空元素存放。

HashSet中存放的元素没有顺序,当使用HashSet的时候,它的hashCode方法会得到调用,判断增加的元素和已经存放集合中元素hashCode值是否相等,不相等则直接存放,相等则进行equals方法比较,比较的值true则表示集合中已经存放了该元素,否则存放。HashSet可以允许空元素是因为在HashSet中可以确定只有一个空元素即不重复,这样集合就可以确认每个元素的位置,最终可以等到有效的访问,所以允许空元素。

TreeSet集合因为在存放的同时会绑定个比较器,存放进来的每一个元素都有在比较器中进行比较,最终确定该元素在集合中的有效位置。不能存放空元素,因为空元素不具备比较性,当存放到TreeSet中的时候,不能被比较器进行有效的比较。所有TreeSet不允许存放空元素。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
因为TreeSet需要排序而HashSet不需要,空的无法排序
回复 使用道具 举报
TreeSet中的元素师有序的。如果TreeSet里面的元素都是实现了Comparable,传入null值的话,内部调用compareTo方法时,会不知道按什么来比较。
回复 使用道具 举报
List 集合: 被比较的对象要重写equals()方法, 调用List中contains()方法,就是用equals()方法比较的.                  


  List 集合 (允许重复元素,允许空值)

2 HashSet集合(不允许重复元素,允许空值): 被比较的对象要重写hashCode()方法和重写equals()方法, 两个都要.

3 TreeSet集合.(不允许重复元素):

    方法一:被比较的对象(如学生类)实现Comparable接口,重写CompareTo()方法.--(不允许空值)

    方法二:TreeSet的构造方法,传入Comparator接口的实现类,他是重写了compare()方法.--(允许空值)

4 HashMap集合: 与HashSet情况一样.

5 TreeMap集合: 与TreeSet情况一样.  

6  顺便说一下, 对List排序可用Collections类的sort()方法.要用到Comparable或Comparator接口.

===========================================================

list:arraylist,vector,linkedlist,其中vetctor线程同步,linkedlist插删
基本上list都是基于array的;里面的元素都可以重复;
set:hashset,treeset;set不能够重复,set是基于map的;treeset是排序的
list和set是继承collection接口的,map不是
map:hashtable,hashmap,treemap;hashtable是线程同步的,map的key不能够重复,value可以;treemap是排序的
另外,没记错的话,list,set,map都是可以使用collections.sort()排序的

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
彭泳 中级黑马 2012-2-13 19:02:32
7#
HashSet与TreeSet区别: 1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值 2、HashSet 是哈希表实现的,HashSet中的数据是无序。于TreeSet要排序而HashSet不要,空的没法排序.

评分

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

查看全部评分

回复 使用道具 举报
大家讲的精辟
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马