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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序猿 中级黑马   /  2012-4-26 17:23  /  2542 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 欧阳梦南 于 2012-4-26 17:24 编辑

听课听到这里,讲到HashSet的底层是哈希表,TreeSet的底层是什么呢?视频里貌似没说啊或者我漏掉了?也是哈希表么?
还有昨天听的还挺明白的,什么集合先调用equals,什么时候调用compareTo。今天一起床感觉都忘了呢。大家都是怎么记忆的呢?

4 个回复

倒序浏览
treeset用的是二叉树排列的
多敲代码
回复 使用道具 举报
Set集合:无序,不重复。该接口中的方法和Collection接口中的方法一致。
        |--HashSet:底层哈希表数据结构,不同步的。它保证元素唯一性的方式:
                                根据元素的两个方法来完成的。一个是hashCode,一个是equals.
                                只有当hashCode方法算出的哈希值相同时,会再次判断两个元素的equals方法是否为true.
                                如果是true,说明两个元素相同,不存.
                                所以,往HashSet集合中存储自定义对象时,要覆盖hashCode,equals方法。
                                通过自定义对象自身具备的特有数据来定义hashCode,equals的具体实现。
                               
        |--TreeSet:用于给Set集合中的元素按照指定的顺序进行排序。底层是二叉树数据结构。线程是不同步的。
                                如何保证元素唯一性呢?
                                就是通过元素对象的比较方法返回值来确定的。如果为0,视两个元素为相同元素,不存。
                               
                                排序方式一:
                                让元素自身具备比较功能,就是强制让元素去实现Comparable接口,覆盖compareTo方法。
                                这时元素具备的自然排序。
                               
                                可是如果元素自身不具备比较功能,获取具备的比较功能不是所需要的。
                                这时排序方式一就用不了了。
                                排序方式二:
                                让集合自身具备比较功能,需要定义比较器,其实就是将实现了Comparator接口的子类对象作为
                                参数传递给TreeSet集合的构造函数。让TreeSet集合一创建就具备了比较功能。
                                该子类必须要覆盖compare方法。
回复 使用道具 举报
我给你看个例子,一看就明白了。

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
回复 使用道具 举报
可以先看一下这个图
           Set
             |
        AbstractSet
                  |     |
         TreeSet  HashSet
HashSet是通过散列法的机制存贮信息,这其中间键的信息用于确定一个唯一的值(称为哈希码),键和他的哈希码转化是自动完成,我们看不到哈希码本身。其创建的是哈希表存贮集合
TreeSet的底层是一种有序的Set,对象以升序存贮,访问和遍历时间都很快,所以是存贮大量信息并且能很快查找排序很好的选择
equals 是在不重写的情况下比较两个值的大小或内容是否相等
而compare to一般用来 比较引用的对象的值  而且可以被重写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马