黑马程序员技术交流社区
标题:
TreeSet
[打印本页]
作者:
程序猿
时间:
2012-4-26 17:23
标题:
TreeSet
本帖最后由 欧阳梦南 于 2012-4-26 17:24 编辑
听课听到这里,讲到HashSet的底层是哈希表,TreeSet的底层是什么呢?视频里貌似没说啊或者我漏掉了?也是哈希表么?
还有昨天听的还挺明白的,什么集合先调用equals,什么时候调用compareTo。今天一起床感觉都忘了呢。大家都是怎么记忆的呢?
作者:
chenwei
时间:
2012-4-26 17:29
treeset用的是二叉树排列的
多敲代码
作者:
孙天
时间:
2012-4-26 17:35
Set集合:无序,不重复。该接口中的方法和Collection接口中的方法一致。
|--HashSet:底层哈希表数据结构,不同步的。它保证元素唯一性的方式:
根据元素的两个方法来完成的。一个是hashCode,一个是equals.
只有当hashCode方法算出的哈希值相同时,会再次判断两个元素的equals方法是否为true.
如果是true,说明两个元素相同,不存.
所以,往HashSet集合中存储自定义对象时,要覆盖hashCode,equals方法。
通过自定义对象自身具备的特有数据来定义hashCode,equals的具体实现。
|--TreeSet:用于给Set集合中的元素按照指定的顺序进行排序。底层是二叉树数据结构。线程是不同步的。
如何保证元素唯一性呢?
就是通过元素对象的比较方法返回值来确定的。如果为0,视两个元素为相同元素,不存。
排序方式一:
让元素自身具备比较功能,就是强制让元素去实现Comparable接口,覆盖compareTo方法。
这时元素具备的自然排序。
可是如果元素自身不具备比较功能,获取具备的比较功能不是所需要的。
这时排序方式一就用不了了。
排序方式二:
让集合自身具备比较功能,需要定义比较器,其实就是将实现了Comparator接口的子类对象作为
参数传递给TreeSet集合的构造函数。让TreeSet集合一创建就具备了比较功能。
该子类必须要覆盖compare方法。
作者:
赵嘉男
时间:
2012-4-26 17:42
我给你看个例子,一看就明白了。
public class Demo{
public static void main(String args[]){
TreeSet ts = new TreeSet(new MyComp());
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
// Get an iterator
Iterator i = ts.iterator();
// Display elements
while(i.hasNext()) {
Object element = i.next();
System.out.print(element + " ");
}
System.out.println();
}
}
class MyComp<T> implements Comparator<T>{
public int compare(T a, T b) {
String aStr, bStr;
aStr = (String) a;
bStr = (String) b;
// reverse the comparison
return bStr.compareTo(aStr);
}
}
这个是treeset通过实现comparator接口进行对比的,后面的mycomp是比较器,这是treeset的一种特性,,在你传值的时候他会根据这个比较器进行存放,你取出的时候是已经比较好的。逆序是因为你实现的的mycomp中以b作为基准也就是后一个值比前一个值。他存放就是以后来的值为准不断调整进来过的值。。。你把比较器的最后return改成return aStr.compareTo(bStr); 就会变成正的了。。。至于这个compareTo则是string类的比较方法。 根据大小返回正数 ,负数,0
作者:
亚男
时间:
2012-4-26 18:35
可以先看一下这个图
Set
|
AbstractSet
| |
TreeSet HashSet
HashSet是通过散列法的机制存贮信息,这其中间键的信息用于确定一个唯一的值(称为哈希码),键和他的哈希码转化是自动完成,我们看不到哈希码本身。其创建的是哈希表存贮集合
TreeSet的底层是一种有序的Set,对象以升序存贮,访问和遍历时间都很快,所以是存贮大量信息并且能很快查找排序很好的选择
equals 是在不重写的情况下比较两个值的大小或内容是否相等
而compare to一般用来 比较引用的对象的值 而且可以被重写
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2