黑马程序员技术交流社区

标题: 关于集合问题!! [打印本页]

作者: 521123270    时间: 2015-5-23 09:49
标题: 关于集合问题!!
java中hashSet与treeSet区别?什么时候实现comrable  什么时候实现comparator!!!!?求详解!!!{:3_65:}
作者: lhwinner    时间: 2015-5-23 09:49
treeset集合底层是二叉树结构,而hashset集合底层是哈希表结构
因此treeset可以对存入进集合的元素进行比较,因此存入treeset集合的元素必须具有可比较性,而hashset对存入的元素没有此要求;同时treeset可以模拟队列和栈,有其特有的方法addfirst(),addlast(),getfirst(),getlast()方法,而hashset不能实现。
如果是自定义类的对象要存入treeset集合中,这个自定义类必须实现comparable接口,并覆盖其中的compareTo方法,让自定类的元素具有可比较性
如果自定义的类不实现comparable接口或其他元素不具备比较性或比较的方法不是所需的(treeset集合中默认排序的方式是自然排序),这时可以让集合具有可以比较性,这时可以自定义一个类实现comparator接口,在创建treeset集合对象时把比较器子类(自定义类)传入treeset集合类的构造参数,从而实现对传入的元素进行比较排序
当元素所属的类实现了comparable和比较器同时存在时,以比较器所定义的比较方式为准
作者: 半世心修    时间: 2015-5-23 10:48
两个都是比较器。实现了前者就让类本身具有比较行了,直接用sort方法进行排序,但是要修改类的代码,也就是内部实现。
而后者做到了算法与对象的分离,是定义在外部的,比较时要向sort传入比较器。
HashSet是基于hashmap的,Treeset基于treemap,自然排序
作者: 途中ms前进    时间: 2015-5-23 14:25
HashSet:底层结构是哈希表 元素是无序的,元素唯一性是通过hashcode和equals来完成的,如果元素hashCode值相同才会判断equals 是否为true,如果元素值不同不会调用equals。
TreeSet:底层是二叉树,可以对集合元素进行排序,保证唯一性是:第一种方式让元素自身具备比较性,元素需要实现comparable接口覆盖compareTo方法也称为元素的自然顺序或默认顺序(比如学生按年龄排序).
第二种方式当元素本身不具备比较性或者具备的比较性不是所需要的,就需要让集合自身具备比较性,在集合初始化就有了比较方式 comparator 构造一个新的空TreeSet 他根据指定的比较器进行排序。
作者: 笔墨痕干    时间: 2015-5-23 14:51
HashSet:底层数据结构是哈希表,元素无序,但是唯一,保证唯一性通过HashCode方法和equals方法来实现
TreeSet:底层数据结构是二叉树,元素无序,但唯一,通过compareTo方法来比较实现数据唯一性,
你希望数据按照你想的来排序的时候,你可以实现comrable接口,重写ompareTo方法
作者: yas丶    时间: 2015-5-23 17:19
过来学习下
作者: 被淹死的虫子    时间: 2015-5-23 19:50
学习学习
作者: YRDHelloworld    时间: 2015-5-23 20:46
HashSet:底层数据结构是哈希表,保证元素唯一性的是hashCode和equals方法
TreeSet:底层数据结构是二叉树,保证元素唯一性的是通过compareTo方法实现
让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo方法,这种方法也称为自然排序
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式,所以需要实现Comparator接口,自定义比较器
作者: 进击的蜗牛    时间: 2015-5-23 23:02
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key 。Comrable和Comparator两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
作者: lhwinner    时间: 2015-5-24 15:48
treeset集合底层是二叉树结构,而hashset集合底层是哈希表结构
因此treeset可以对存入进集合的元素进行比较,因此存入treeset集合的元素必须具有可比较性,而hashset对存入的元素没有此要求;同时treeset可以模拟队列和栈,有其特有的方法addfirst(),addlast(),getfirst(),getlast()方法,而hashset不能实现。
如果是自定义类的对象要存入treeset集合中,这个自定义类必须实现comparable接口,并覆盖其中的compareTo方法,让自定类的元素具有可比较性
如果自定义的类不实现comparable接口或其他元素不具备比较性或比较的方法不是所需的(treeset集合中默认排序的方式是自然排序),这时可以让集合具有可以比较性,这时可以自定义一个类实现comparator接口,在创建treeset集合对象时把比较器子类(自定义类)传入treeset集合类的构造参数,从而实现对传入的元素进行比较排序
当元素所属的类实现了comparable和比较器同时存在时,以比较器所定义的比较方式为准
作者: 执剑、砍人    时间: 2015-5-24 15:50
还没学到!!!!
作者: 城北一直晴。    时间: 2015-5-24 17:15
我在学习的时候就直接的什么都过了,想这些概念都没见着的感觉。好像不是毕老师讲的视频里的吧?
作者: 逝....曾经    时间: 2015-5-24 17:57
HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
作者: 尹世伟    时间: 2015-5-24 18:20
我是来学习的
作者: aSmallStone    时间: 2015-5-24 22:02
类似的问题  来围观。
作者: 紫夜流星    时间: 2015-5-24 23:21
学习学习
作者: 人在旅途~东营    时间: 2015-5-25 00:29
本来想来答题的,后来看了一下各位大侠各有见解,回答的也都不错啊,当然还有一些需要细化的东西。不过基础班这个水准是不错的了啊
作者: JavaStudy770    时间: 2015-5-25 00:31
楼上的都回答得太好了
作者: 落雪    时间: 2015-5-25 13:09
过来学习学习
作者: 风之旅人    时间: 2015-5-30 21:38
学习路过




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