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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 521123270 中级黑马   /  2015-5-23 09:49  /  3573 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币
java中hashSet与treeSet区别?什么时候实现comrable  什么时候实现comparator!!!!?求详解!!!{:3_65:}

最佳答案

查看完整内容

treeset集合底层是二叉树结构,而hashset集合底层是哈希表结构 因此treeset可以对存入进集合的元素进行比较,因此存入treeset集合的元素必须具有可比较性,而hashset对存入的元素没有此要求;同时treeset可以模拟队列和栈,有其特有的方法addfirst(),addlast(),getfirst(),getlast()方法,而hashset不能实现。 如果是自定义类的对象要存入treeset集合中,这个自定义类必须实现comparable接口,并覆盖其中的compareTo方法,让自定类 ...

19 个回复

倒序浏览
treeset集合底层是二叉树结构,而hashset集合底层是哈希表结构
因此treeset可以对存入进集合的元素进行比较,因此存入treeset集合的元素必须具有可比较性,而hashset对存入的元素没有此要求;同时treeset可以模拟队列和栈,有其特有的方法addfirst(),addlast(),getfirst(),getlast()方法,而hashset不能实现。
如果是自定义类的对象要存入treeset集合中,这个自定义类必须实现comparable接口,并覆盖其中的compareTo方法,让自定类的元素具有可比较性
如果自定义的类不实现comparable接口或其他元素不具备比较性或比较的方法不是所需的(treeset集合中默认排序的方式是自然排序),这时可以让集合具有可以比较性,这时可以自定义一个类实现comparator接口,在创建treeset集合对象时把比较器子类(自定义类)传入treeset集合类的构造参数,从而实现对传入的元素进行比较排序
当元素所属的类实现了comparable和比较器同时存在时,以比较器所定义的比较方式为准
回复 使用道具 举报
两个都是比较器。实现了前者就让类本身具有比较行了,直接用sort方法进行排序,但是要修改类的代码,也就是内部实现。
而后者做到了算法与对象的分离,是定义在外部的,比较时要向sort传入比较器。
HashSet是基于hashmap的,Treeset基于treemap,自然排序
回复 使用道具 举报
HashSet:底层结构是哈希表 元素是无序的,元素唯一性是通过hashcode和equals来完成的,如果元素hashCode值相同才会判断equals 是否为true,如果元素值不同不会调用equals。
TreeSet:底层是二叉树,可以对集合元素进行排序,保证唯一性是:第一种方式让元素自身具备比较性,元素需要实现comparable接口覆盖compareTo方法也称为元素的自然顺序或默认顺序(比如学生按年龄排序).
第二种方式当元素本身不具备比较性或者具备的比较性不是所需要的,就需要让集合自身具备比较性,在集合初始化就有了比较方式 comparator 构造一个新的空TreeSet 他根据指定的比较器进行排序。
回复 使用道具 举报
HashSet:底层数据结构是哈希表,元素无序,但是唯一,保证唯一性通过HashCode方法和equals方法来实现
TreeSet:底层数据结构是二叉树,元素无序,但唯一,通过compareTo方法来比较实现数据唯一性,
你希望数据按照你想的来排序的时候,你可以实现comrable接口,重写ompareTo方法
回复 使用道具 举报
过来学习下
回复 使用道具 举报
学习学习
回复 使用道具 举报
HashSet:底层数据结构是哈希表,保证元素唯一性的是hashCode和equals方法
TreeSet:底层数据结构是二叉树,保证元素唯一性的是通过compareTo方法实现
让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo方法,这种方法也称为自然排序
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式,所以需要实现Comparator接口,自定义比较器
回复 使用道具 举报
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key 。Comrable和Comparator两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
回复 使用道具 举报
treeset集合底层是二叉树结构,而hashset集合底层是哈希表结构
因此treeset可以对存入进集合的元素进行比较,因此存入treeset集合的元素必须具有可比较性,而hashset对存入的元素没有此要求;同时treeset可以模拟队列和栈,有其特有的方法addfirst(),addlast(),getfirst(),getlast()方法,而hashset不能实现。
如果是自定义类的对象要存入treeset集合中,这个自定义类必须实现comparable接口,并覆盖其中的compareTo方法,让自定类的元素具有可比较性
如果自定义的类不实现comparable接口或其他元素不具备比较性或比较的方法不是所需的(treeset集合中默认排序的方式是自然排序),这时可以让集合具有可以比较性,这时可以自定义一个类实现comparator接口,在创建treeset集合对象时把比较器子类(自定义类)传入treeset集合类的构造参数,从而实现对传入的元素进行比较排序
当元素所属的类实现了comparable和比较器同时存在时,以比较器所定义的比较方式为准
回复 使用道具 举报
还没学到!!!!
回复 使用道具 举报
我在学习的时候就直接的什么都过了,想这些概念都没见着的感觉。好像不是毕老师讲的视频里的吧?
回复 使用道具 举报
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
回复 使用道具 举报
我是来学习的
回复 使用道具 举报
类似的问题  来围观。
回复 使用道具 举报
学习学习
回复 使用道具 举报
本来想来答题的,后来看了一下各位大侠各有见解,回答的也都不错啊,当然还有一些需要细化的东西。不过基础班这个水准是不错的了啊
回复 使用道具 举报
楼上的都回答得太好了
回复 使用道具 举报
过来学习学习
回复 使用道具 举报
学习路过
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马