set——哈希set(hashset)和treeset

下面是学习的时候写的一些代码:

1.hashSet的基本使用

2.hashset的特性

3.treeSet的基本使用

4.使用treeSet存自定义对象

5.比较器和对象的自然排序


 1.hashSet的基本使用

    private static void demo05() {
        //初始化
        HashSet<Integer> hSet = new HashSet();
        //添加
        hSet.add(45);
        hSet.add(77);
        hSet.add(26);
        hSet.add(185);
        hSet.add(523);
        hSet.add(94);
        hSet.add(45);
        
        //特点一:无序
        //特点二:元素不能重复
        System.out.println(hSet);
        
        //移除
        hSet.remove(45);
        //hSet.clear();
        System.out.println(hSet);
        
        //获取
        System.out.println(hSet.size());
        System.out.println(hSet.isEmpty());
        System.out.println(hSet.contains(88));
        
        /*
         * hashSet的迭代方法,同list
         */
        Iterator<Integer> it = hSet.iterator();
        
    }

2.hashset的特性

private static void demo06() {
    /*
     * hashset特性
     */
    /*
     * hashset默认大小为16,在存数据时,先通过hash函数算出一个返回值,然后根据返回值计算存在哪个位置
     * 不会按照顺序存进去
     * 哈希表中存储数据是由哈希函数来分布,哈希函数就是元素的hashcode函数
     * 
     * 如果两个元素的hash值相同,
     *             ->再次调用元素的equals方法来比较两个对象是否相同,如果相同就忽略
     *             ->如果equals判断不相同,就会以链表的方式进行挂桶
     */
    
        HashSet<String> hSet = new HashSet();
        hSet.add("t1");
        hSet.add("t1");
        hSet.add("t1");
        hSet.add("t4");
        hSet.add("t5");
        hSet.add("t6");
        
        //迭代
        for (String str : hSet) {
            System.out.println(str);
        }
        
        //整数的哈希值是?
        System.out.println(new Integer(50).hashCode());//50,整数的hash值就是它本身
        System.out.println("a".hashCode());//97,字符的hash值就是ASCII码
        System.out.println("abc".hashCode());//96354,通过hashcode方法进行计算
        
        //对象默认的hash值就是地址的10进制值
        //计算hash值得属性,一般用特殊属性值来进行计算
    }

3.treeSet的基本使用

private static void demo07() {
        /*
         * treeSet的基本使用
         * 判断大小是compareTo方法,判断元素相同时compareTo返回0就表示相同,
         */
    //保存整数
    TreeSet<Integer> tSet = new TreeSet<>();
    //添加
    tSet.add(12);
    tSet.add(5);
    tSet.add(97);
    tSet.add(21);
    tSet.add(-1);
    tSet.add(21);
    System.out.println(tSet);
    
    /*
     * treeSet特点:
     *     一:唯一性
     *     二:会自动排序
     */
    
    for (Integer integer : tSet) {
        System.out.println(integer);
    }
    
    //字符串
    TreeSet<String> tSet2 = new TreeSet<>();
    tSet2.add("aaa");
    tSet2.add("bbbb");
    tSet2.add("ccccc");
    tSet2.add("dddddd");
    tSet2.add("OOObb");
    tSet2.add("aaa");
    System.out.println(tSet2);//字符串排序,如果第一个相同就比较第二个大小,以此类推
    
    
    }

4.使用treeSet存自定义对象

 

private static void demo08() {
        /*
         * 使用treeSet存自定义对象
         * 判断是否相同的方法不再是hashcode和equals方法,而是compareTo是否返回0
         */
    TreeSet<Student> tSet = new TreeSet<>();
    tSet.add(new Student("小明8", 25));
    tSet.add(new Student("小明", 21));
    tSet.add(new Student("小明6", 20));
    tSet.add(new Student("小明3", 29));
    tSet.add(new Student("小明9", 18));
    tSet.add(new Student("小明", 21));
    tSet.add(new Student("小明9", 18));
    
    for (Student stu : tSet) {
        System.out.println(stu);
    }
        
    }

5.比较器和对象的自然排序

比较器,是自己新建一个类,实现comparator接口。

public class ComparatorWithPerson implements Comparator<Person>{
    /*
     * 1.不需要定制自然规则,使用比较器来实现排序
   * 此处我新建了一个ComparatorWithPerson类,实现Comparator接口,该接口实现的类型是我定义的person类。
*/ @Override public int compare(Person o1, Person o2) { int ageRes = o1.getAge()-o2.getAge(); int nameRes = o1.getName().compareTo(o2.getName()); // 年龄优先 //return ageRes == 0 ? nameRes : ageRes; // 姓名优先 return nameRes == 0 ? ageRes : nameRes; }

自然排序就是在我定义的person类中,重写compareTo方法

    /*
     * 2.定制person对象的自然排序规则
     */
    @Override
    public int compareTo(Person o) {
    // 定制排序规则
    int ageRes = this.age - o.getAge();
    int nameRes = this.name.compareTo(o.getName());
    // 年龄优先
    //return ageRes == 0 ? nameRes : ageRes;
    // 姓名优先
    return nameRes == 0 ? ageRes : nameRes;
}

 

posted on 2018-09-10 09:48  谭二皮  阅读(217)  评论(0编辑  收藏  举报

导航