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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gzbbxu 中级黑马   /  2013-6-27 13:18  /  1386 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

听了也听不懂。。强烈表示不理解。

评分

参与人数 1黑马币 +5 收起 理由
神之梦 + 5

查看全部评分

6 个回复

倒序浏览
|-- HashSet
       |-- 底层是哈希表,不存储重复元素
       |-- 存储自定义对象,需要覆盖对象中的hashCode和equals方法,保证对象对象唯一
     |-- TreeSet
       |-- 底层是二叉树结构,不存储重复元素
       |-- 存储对象,按照对象的自然顺序排序
       |-- 自定义对象,必须具备比较性
         |--对象本身具备比较性,实现Comparable接口,覆盖compareTo方法
         |--TreeSet本身具备比较性,自定义比较器,实现Comparator接口,覆盖compare方法

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
神之梦 + 1 + 2 赞一个!

查看全部评分

回复 使用道具 举报
王靖远 发表于 2013-6-27 13:30
|-- HashSet
       |-- 底层是哈希表,不存储重复元素
       |-- 存储自定义对象,需要覆盖对象中的hash ...

你的这个总结非常好,谢谢。
回复 使用道具 举报
HashSet:底层是哈希表数据结构;集合中的元素是无序的(存入和取出的顺序不一定一致);元素不可以重复。


TreeSet底层数据结构是二叉树;元素可以按照自然顺序排序;元素不可以重复;


HashSet保证元素唯一性的依据:通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashcode值不同,不会调用equals。


TreeSet保证元素唯一性的依据:compare方法return 0。可以对集合中的元素进行排序,本身是按照自然顺序排序。 (TreeSet第一种排序方式:让元素自身具备比较性,如果本身不具备毕比较性,元素需要实现Comparable接口,覆盖compareTo方法。Tree排序的第二中排序方式:当元素自身不具有比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,自定义比较器,实现Comparator接口,覆盖compare方法)


评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
神之梦 + 1 + 2 赞一个!

查看全部评分

回复 使用道具 举报
1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.   a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.   b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象       才可以真正定位到键值对应的Entry.   c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.   a. Comparator可以在创建TreeMap时指定   b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.   c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 哥们,排版弄好点

查看全部评分

回复 使用道具 举报
import java.util.HashSet;
import java.util.Iterator;


class Student{
        @Override
        public String toString() {
       
                return this.name;
               
        }
        @Override
        public int hashCode() {//一,覆写Object中的hashCode()方法。
                System.out.println("hashCode");
                return this.age*3+27;
        }
        @Override
        public boolean equals(Object obj) {//二,覆写Object中的equals()方法。
               
                Student s=(Student)obj;//将obj强转成Student类型。
                System.out.println(this+"..equals..."+s);
                if(this.age==s.getAge()) {
                        return this.getName().equals(s.getName());
                }
                else {
                        return this.age-s.age==0;
                }
               
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getAdd() {
                return add;
        }
        public void setAdd(String add) {
                this.add = add;
        }
        private int age;
        private String name;
        private String add;
        public Student(int age, String name, String add) {
                super();
                this.age = age;
                this.name = name;
                this.add = add;
        }
               
}
public class HashSetDemo {

       

        /**
         * @param args
         */
        public static void main(String[] args) {
                /*HashSet集合特点:存取无序,不允许元素重复,通过调用元素的hashCode()方法和equals()方法
                 * 来判断元素是否相同。所以,集合中存储的元素,要覆写hashCode()和equals()方法。
                 */
                HashSet<Student> hs=new HashSet<Student>();
                hs.add(new Student(23,"张三","北京"));
                hs.add(new Student(20,"小明","上海"));
                hs.add(new Student(19,"李四","天津"));
                hs.add(new Student(23,"张三","北京"));
                Iterator<Student> it=hs.iterator();
                while(it.hasNext()){
                        Student s=it.next();
                        System.out.println(s.getAge()+"::"+s.getName()+"::"+s.getAdd());
                }
        }

}
回复 使用道具 举报
花伟昌 发表于 2013-6-28 10:08
import java.util.HashSet;
import java.util.Iterator;

是否来点文字说明会更好尼?我觉得是的,不知道你怎么觉得了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马