黑马程序员技术交流社区

标题: Set的子类HashSet的问题 [打印本页]

作者: 蒙武辉    时间: 2012-2-16 02:36
标题: Set的子类HashSet的问题
HashSet底层数据结构是哈希表,但是我不知道什么是哈希表?HashSet怎么情况下使用?如何用?可以举个例子说明一下吗?
作者: 李杨    时间: 2012-2-16 02:53
        public static void main(String[] args)
        {
                Set<String> set = new HashSet<String>();
               
                String str1 = "hello";
                String str2 = "world";
                String str3 = "welcome";
                String str4 = "tom";
                String str5 = "akon";
                String str6 = "tom";
               
               
                set.add(str1);
                set.add(str2);
                set.add(str3);
                set.add(str4);
                set.add(str5);
                set.add(str6);
                set.add(str1);
               
                System.out.println(set);
        }

一般都会使用TreeSet也是首选,TreeSet是可以排序的集合。
HashSet不能排序,HashSet底层是使用HashMap实现的。当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)

当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

常规都会选择排序的集合,方便管理。
作者: 彭嘉聪    时间: 2012-2-16 15:59
我调出的我日记来解答一下吧

其实set对应的数学结构就是集合,所以集合没有相同的元素,
所以传入的自定义类的元素,必须先重写equals()方法,
用于判断是否相同再传入,其底层结构是hash表,什么是哈希表呢?
在数据结构中,为了优化查找效率,就制造了散列技术,就是哈希表,
利用哈希函数(对应hashcode方法返回值)对元素进行运算,得出值映射到哈希表中,
而且为了解决冲突(值相同)所以利用开发地址和拉链法解决冲突,
从而实现在理想的状态下查询期望时间为O(1);
所以在HashSet中的元素是没有顺序,不重复的。

有关散列技术详细可以查询数据结构书籍
作者: 最初的理想    时间: 2012-2-16 19:51
哈希表哈希算法之类的要说清楚本菜也不知道,只知道大概。lz可以百度




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