黑马程序员技术交流社区

标题: Java HashSet和TreeSet的区别 [打印本页]

作者: Hawking    时间: 2016-4-6 23:12
标题: Java HashSet和TreeSet的区别

1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key

2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.

3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.

a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.

b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的Entry.

c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value

4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.

a. Comparator可以在创建TreeMap时指定

b. 如果创建时没有确定,那么就会使用key.com



作者: 荒丶    时间: 2016-4-7 00:33
那么HashSet的底层是什么数据结构呢?数组还是链表呀?
作者: Hawking    时间: 2016-4-7 21:33
荒丶 发表于 2016-4-7 00:33
那么HashSet的底层是什么数据结构呢?数组还是链表呀?

HashMap实际上是一个“链表的数组”的数据结构,每个元素存放链表头结点的数组,即数组和链表的结合体。
也就是说HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组.Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。

个人理解,错了莫怪!!
作者: zuiaidasde2016    时间: 2016-4-7 22:03
分析的很有道理
作者: Hawking    时间: 2016-4-7 22:29
zuiaidasde2016 发表于 2016-4-7 22:03
分析的很有道理

过奖!!
你的看法呢?
集思广益嘛!
作者: 陌丶    时间: 2016-4-7 23:05
赞赞赞!!!
作者: 赵浩霖    时间: 2016-4-7 23:18
666明天才开讲Map
作者: yaolv7    时间: 2016-4-7 23:21
我是进来学习的
作者: 腾龙3158    时间: 2016-4-8 00:37
学习了!!!




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