Demo19_Set接口

package test10;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo19_set接口 {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String[] args) {
//      set不包含重复元素方法与collection一致,set集合去除元素的方式只有一种:迭代器
        /*不保证有序
         * HashSet:哈希表结构,不同步,保护元素唯一性依赖于: hashCode(); equals();【哈希值不一样时不会执行】方法
         * TreeSet:可以对set集合里面的元素进行排序   二叉树结构 使用的对象比较方法的结果是否为零,相同元素不存
         * TreeSet中元素的排序有两种方式:
         * 1.元素自身具备的自然排序,其实就是实现了Comparable接口重写了compareTo方法如果自身的元素不具备自然排序,或者具备的自然排序不是所需要的,这时只能用第二种方式
         * 2.比较器  其实就是在创建TreeSet集合时,在构造函数中指定的具体的比较方式需要定义一个类实现comparator接口,重写compare方法
         * 在往集合中存储对象时,通常该对象都需要覆盖hashCode,equals同时实现comparable接口,同时实现comparable接口建立对象的自然排序
         * 通常还有一个方法也会复写toString();
         * 
         * 数组中存储的是元素,哈希表对应的是关系
         * 哈希表查询的速度比数组快,重复元素无法存储,保证了元素的唯一性
         * 
         * 哈希表
         * 給定一个数值组“ab” = 97 98
         * 创建一个十个位置的哈希表
         * 给定一个算法function(int date)
         * {
         * (97+98)%10= 5;
         * }
         * 将ab存储到哈希表上5的位置
         * 
         * 每一个新建的对象都有自己独特的哈希值
         * 
         *  怎么解决哈希冲突(两个对象的哈希值相同)问题?
         *  元素的哈希值hashCode()一致了,这时就会再次判断元素的内容是否相同(equals)
         *  如果equals反悔了true,以为这两个元素相同,不存储
         *  如果返回false,一位这两个元素不相同,存储。继续通过算法算出位置。拉链法
         * 
         *  为什么学生对象没有保证唯一性?
         *  通过哈希表我们可以看出存储元素时,先调用元素对象的hashCode()方法,而每一个学生对象都是新建立的你 对象
         *  所以每一个对象的哈希值都不同,也就不能判断equals了
         *  想要保证同姓名同年龄的学生对象的唯一性就必须重写Object中的hashCode方法
         * 
         *  
         *  
         *  集合体系   
         *  
         *  List :新出的子类都是以list结尾的通常是非同步的
         *  |--ArrayList :array 数组  查询速度快
         *  |--LinkedList:link 链表  增删速度快
         *  
         *  Set  :
         *  |--HashSet :Hash  哈希表   查询速度更快  元素唯一性  通过hashCode,equals来保证唯一性 
         *  |--TreeSet :tree  二叉树   可以排序    Comparable-compareTo  Comparator-compare方法
         *  */

        Set set =new HashSet();
        set.add("1111");
        set.add("2222");
        set.add("4444");
        set.add("4444");
        set.add("4444");
        set.add("3333");
        set.add("2222");
        set.add("4444");
        set.add("2222");
        set.add("2222");
        set.add("4444");
        set.add("4444");
        set.add("2222");
        for (Iterator it = set.iterator(); it.hasNext();) {
            System.out.println(it.next());

        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值