java之Set接口与实现类

Set 集合

Set 集合概述

  • 特点:无序、无下标、元素不可重复

  • 方法:全部继承自Collection中的方法

Set 接口使用

  • /**
     * Set 接口的使用
     * 特点:无序、没有下标
     *      不能重复
     */
    
    public class Demo01 {
          
          
        public static void main(String[] args) {
          
          
    //        创建集合
            HashSet<String> set = new HashSet<>();
    //        添加数据
            set.add("苹果") ;
            set.add("香蕉") ;
            set.add("橘子") ;
    //        set.add("苹果") ;
            System.out.println("数据个数:"+set.size());
            System.out.println(set.toString());
    //        删除元素
    //        set.remove("小米");
    //        System.out.println(set.toString());
    //        遍历
    //        使用增强for
            for (String string : set) {
          
          
                System.out.println(string);
    
            }
    //        使用迭代器
            Iterator<String> it = set.iterator();
            while (it.hasNext()){
          
          
                System.out.println(it.next());
            }
    //      判断
            System.out.println(set.contains("苹果"));
            System.out.println(set.isEmpty());
    
        }
    }
    

HashSet 使用

  • HashSet :【重点】

    • 基于HashCode实现元素不重复
    • 当存入元素的哈希码相同时,就会调用equals进行确认,如结果为true,则拒绝后者存入
public class Demo02 {
    
    
    public static void main(String[] args) {
    
    
//        新建集合
        HashSet<String> hashSet  = new HashSet<>();
//        添加元素
        hashSet.add("刘德华");
        hashSet.add("梁朝伟");
        hashSet.add("林志林");
        hashSet.add("周润发");
//        hashSet.add("刘德华");
        System.out.println("元素个数:"+hashSet.size());
        System.out.println(hashSet.toString());
//        删除数据
        hashSet.remove("刘德华");
        System.out.println("元素个数:"+hashSet.size());
//     遍历
//        增强for
        for (String string : hashSet) {
    
    
            System.out.println(string);
        }
//        迭代器
        Iterator<String> it = hashSet.iterator();
        while (it.hasNext()){
    
    
            System.out.println(it.next());
        }
//        判断
        System.out.println(hashSet.contains("成龙"));
        System.out.println(hashSet.isEmpty());
    }

}
  • package com.gather.Set;
    
    public class Person {
          
          
        private String name;
        private  int age;
    
        public Person(String name, int age) {
          
          
            this.name = name;
            this.age = age;
        }
    
        public Person() {
          
          
        }
    
        public String getName() {
          
          
            return name;
        }
    
        public void setName(String name) {
          
          
            this.name = name;
        }
    
        public int getAge() {
          
          
            return age;
        }
    
        public void setAge(int age) {
          
          
            this.age = age;
        }
    
        @Override
        public String toString() {
          
          
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
public class Demo03 {
    
    
    public static void main(String[] args) {
    
    
//        创建集合
        HashSet<Person> persons  = new HashSet<>();
//        添加数据
        Person p1 = new Person("刘德华",20);
        Person p2 = new Person("林志林",21);
        Person p3 = new Person("成龙",22);

        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
//        persons.add(p3); 重复

        System.out.println("元素个数:"+persons.size());
        System.out.println(persons.toString());
    }
}

HashSet 存储方式

  • * 存储过程:
    * 1.根据HashCode计算保存位置,如果位置为空,则直接保存,如过不为空执行第二步
    * 2.再执行equals,如果equals方法为true,则认为是重复,否则,形成链表
    

HashSet 补充

  •     @Override
        public boolean equals(Object o) {
          
          
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
    
            Person person = (Person) o;
    
            if (age != person.age) return false;
            return name != null ? name.equals(person.name) : person.name == null;
        }
    
        @Override
        public int hashCode() {
          
          
            int result = name != null ? name.hashCode() : 0;
    //        31是一个质数 ,减少散列冲突       31提高执行效率  31*i=(i<<5)-i
            result = 31 * result + age;
            return result;
        }
    }
    

TreeSet 概述

TreeSet:

  • 基于排列顺序实现元素不重复
  • 实现了SortedSet接口,对集合元素自动排序
  • 元素对象的类型必须实现Comparable接口,指定排序规则
  • 通过CompareTo方法确定是否为重复元素

TreeSet 使用

  • 简单基础使用

    public class Demo04 {
          
          
        public static void main(String[] args) {
          
          
    //       创建集合
            TreeSet<String> treeset = new TreeSet<>();
    //        添加元素
            treeset.add("xyz");
            treeset.add("abc");
            treeset.add("hello");
    //        treeset.add("xyz");
            System.out.println("元素个数:"+treeset.size());
            System.out.println(treeset.toString());
            删除元素
    //        treeset.remove("xyz");
    //        System.out.println("元素个数:"+treeset.size());
    //        System.out.println(treeset.toString());
    //        遍历
    //        使用增强for
            for (String string : treeset) {
          
          
                System.out.println(string);
    
            }
    //       使用迭代器
            Iterator<String> itw = treeset.iterator();
            while (itw.hasNext()){
          
          
                System.out.println(itw.next());
            }
    //        判断
            System.out.println(treeset.contains("xyz"));
            System.out.println(treeset.isEmpty());
    
        }
    }
    
  • 复杂类型使用 实现排序

    /**
     * TreeSet  保存数据
     * 存储结构 : 红黑树
     * 要求:元素必须要实现Comparble 接口
     */
    
    public class Demo05 {
          
          
        public static void main(String[] args) {
          
          
    //        创建集合
            TreeSet<Person> persons = new TreeSet<>();
    //        添加元素
            Person p1 = new Person("xyz",20);
            Person p4 = new Person("xyz",21);
            Person p2 = new Person("abc",21);
            Person p3 = new Person("成龙",22);
    
            persons.add(p1);
            persons.add(p2);
            persons.add(p3);
            persons.add(p4);
    
            System.out.println("元素个数:"+persons.size());
            System.out.println(persons.toString());
    //        删除元素
    //        persons.remove(p1);
    //        System.out.println(persons.size());
    //        遍历
    //        增强for
            for (Person person : persons) {
          
          
                System.out.println(person.toString());
    
            }
    //        使用迭代器
            Iterator<Person> it = persons.iterator();
            while (it.hasNext()){
          
          
                System.out.println(it.next());
            }
    //       判断
            System.out.println(persons.contains(p1));
            System.out.println(persons.isEmpty());
    
        }
    }
    
  • 重写 Comparable 接口

    @Override
    //    先按姓名比,然后按年龄比
        public int compareTo(Person o) {
          
          
            int n1 = this.getName().compareTo(o.getName());
            int n2 = this.age-o.getAge();
            return n1 == 0?n2:n1;
        }
    

Comparator 接口

/**
 * TreeSet 集合的使用
 * Comparator :实现定制比较(比较器)
 * Comparable : 可比较的
 */

public class Demo06 {
    
    
    public static void main(String[] args) {
    
    
//        创建集合,并指定比较规则
        TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
    
    
            @Override
            public int compare(Person o1, Person o2) {
    
    
                int n1 = o1.getAge()-o2.getAge();
                int n2 = o1.getName().compareTo(o2.getName());
                return n1 == 0?n2:n1;
            }
        });
        Person p1 = new Person("xyz",20);
        Person p2 = new Person("xyz",21);
        Person p3 = new Person("abc",21);

        persons.add(p1);
        persons.add(p2);
        persons.add(p3);


        System.out.println("元素个数:"+persons.size());
        System.out.println(persons.toString());
    }
}

TreeSet 案例

/**
 * 要求:使用TreeSet 集合实现字符串按照长度进行排序
 * helloworld zhang lisi wangwu  beijing xian nanjing
 * Comparator 接口实现比较
 */

public class Demo07 {
    
    
    public static void main(String[] args) {
    
    
//        创建集合  并指定比较规则
        TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
    
    
            @Override
            public int compare(String o1, String o2) {
    
    
                int n1 = o1.length()-o2.length();
                int n2 = o1.compareTo(o2);
                return n1 == 0?n2:n1;
            }
        });
//        添加数据
        treeSet.add("helloworld");
        treeSet.add("zhangsan");
        treeSet.add("cat");
        treeSet.add("lisi");
        treeSet.add("xian");
        treeSet.add("nanjing");

        System.out.println(treeSet.toString());

    }
}

猜你喜欢

转载自blog.csdn.net/xiaoxiaobaie/article/details/121593922