java——Set集合

来源:互联网 发布:5sing音乐软件 编辑:程序博客网 时间:2024/06/04 23:50

Set集合:无须 无下标 不重复
一、1.Set接口
Set接口是一个不包含重复元素的集合,由于其继承了Collection接口,所有包含了其全部方法。
这里写图片描述
2.Set接口的实现类
(1)HashSet :
HashSet是Set接口的一个实现类,它不允许重复元素。
HashSet主要依据哈希算法直接将元素指定到地址上。
当添加元素时要调用equls方法来判断是否有重复的元素。
判断是通过hashCode来进行比较的

ublic class Demo01 {    public static void main(String[] args) {        // fun1();        // fun2();        // fun3();        // fun4();        // fun5();        // fun6();    }    private static void fun6() {        // 利用set集合 去除ArrayList集合中的重复元素(操作原ArrayList)        ArrayList<String> list = new ArrayList<>();        list.add("c");        list.add("c");        list.add("a");        list.add("a");        list.add("b");        list.add("b");        // 为了保持存进去的顺序 选用 linkedHashSet        LinkedHashSet<String> set = new LinkedHashSet<>();        // 把List中的所有元素 加到 set 中去重        set.addAll(list);        // 先清空list中原有的元素        list.clear();        // 再把set中的元素 全部添加到 list集合中         list.addAll(set);        System.out.println(list);    }    private static void fun5() {        // 输入一个字符串,去掉其中重复字符,        // 打印出不同的那些字符         // 1.创建set集合        // 2.把接受过来的字符串 转成字符数组        // 3.遍历字符数组 把没听过字符 存入set中        // 4.打印set集合        System.out.println("请输入一个字符串");        Scanner scanner = new Scanner(System.in);        String nextLine = scanner.nextLine();        // 转字符数组        char[] charArray = nextLine.toCharArray();              // 创建set集合        HashSet<Object> set = new HashSet<>();        // 遍历 存储        for (int i = 0; i < charArray.length; i++) {            set.add(charArray[i]);        }        System.out.println(set);    }    private static void fun4() {        // 编写一个程序,获取10个1至20的随机数, 要求随机数不能重复        // 去重————>往Set集合上想        // 1.创建一个Set集合        // 2.随机10个数        // 3.把10个数 添加到集合中           // 4.当集合长度 <10 的时候就添加 >=10 的时候就不添加        HashSet<Integer> set = new HashSet<>();        while (set.size() < 10) {            if (set.size() == 10) {                break;            }            // 随机数            int num = (int)(Math.random() * (20 - 1 + 1) + 1);            // 添加到Set中            set.add(num);// 自动装箱        }        System.out.println(set);    }    private static void fun3() {        // 使用LinkedHashSet 保存两个a,b,c,d 打印一下        // inkedHashSet 特点 有序的(怎么存的就可以怎么取出来)        // HashSet的之类        LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();        linkedHashSet.add("a");        linkedHashSet.add("a");        linkedHashSet.add("b");        linkedHashSet.add("b");        linkedHashSet.add("c");        linkedHashSet.add("c");        linkedHashSet.add("d");        linkedHashSet.add("d");        System.out.println(linkedHashSet);    }    private static void fun2() {        // 创建一个HashSet        // 保存 5个人 并遍历        // 人为年龄 和姓名一样 就是一个人去重        // 重写equals 方法        // 注意:如果你要使用hashSet去除重复的对象        //      直接重写HashCode() 和 equals()方法        HashSet<Person> hashSet = new HashSet<>();        hashSet.add(new Person("可可", 20));        hashSet.add(new Person("可可", 20));        hashSet.add(new Person("亮亮", 22));        hashSet.add(new Person("亮亮", 22));        hashSet.add(new Person("明明", 24));        hashSet.add(new Person("明明", 24));        for (Person person : hashSet) {            System.out.println(person);        }    }    private static void fun1() {        // 创建一个HashSet 保存 两个a b c d        HashSet<String> set = new HashSet<>();        set.add("a");        set.add("a");        set.add("b");        set.add("b");        set.add("c");        set.add("c");        set.add("d");        set.add("d");        // 使用增强for循环 遍历        for (String string : set) {            System.out.println(string);        }        System.out.println(set);    }}
// 重写equals//  // 重写失败 没有触发//  @Override//  public boolean equals(Object obj) {//      System.out.println("猜猜看啊!");//      Person person = (Person)obj;//      return this.name.equals(person.getName())&& this.age == person.getAge();//  }
 重写 hashCode    // HashSet在存储对象 按照哈希值(hashCode)去存储的    // 每存一个对象 都会给这个对象一个哈希值(票)    // 当存储对象的hash值相同的时候    // 系统会默认调用equals方法 去比较两个对象是否一样    // 如果一样 就不存 反之 不一样的时候就保存到Set集合中    // hash值不同的时候 就认为 两个对象是不同的    // 所以没有调用equals方法    // 注意:保存对象的时候 先看hash值    //      hash值一样再看equals    //      hash值不一样 就不看equals了    // 现在想提高效率(少调用几次equals方法)

(2)TreeSet :
TreeSet作用 排序 (去重)

private static void fun2() {        // 创建一个TreeSet 添加4个人 查看是否有排序效果        TreeSet<Person> set = new TreeSet<>();        set.add(new Person("赵", 15));        set.add(new Person("钱", 16));        set.add(new Person("孙", 17));        set.add(new Person("李", 18));        set.add(new Person("周", 18));        System.out.println(set);        System.out.println((int)'赵');        System.out.println((int)'钱');        System.out.println((int)'孙');        System.out.println((int)'李');        System.out.println((int)'周');    }
如果TreeSet 相向里面存储元素    // 就看这个compareTo方法的返回值    /*     * 返回0 只有一个值     * 返回正数 按存进去的顺序 正序     * 返回负数 按存进顺序 倒序     *      * TreeSet 内部使用 二叉树来存储的     * 比我小的数放左边(返回负数时)     * 比我大的数放右边(返回正数时)     * 两个数相等(返回0时)不存储     * 打印时候取升序

**3.创建一个比较器的类
实现比较器接口中
主要按字符串长度比较
次要按字符比
比较器 相当于 TreeSet存储规则**

public class ComparatorImpl implements Comparator<String>{    @Override    public int compare(String o1, String o2) {        int length = o1.length() - o2.length();            int num = length == 0 ? o1.compareTo(o2) : length;            // 如果字符串长度和字符都相同 也需要把字符串存进去            // 所以返回1 或 -1            return num == 0 ? 1 : num ;    }}

字符的比较

public class CharImpl implements Comparator<Character> {    @Override    public int compare(Character o1, Character o2) {        int num = o1 -o2;        return num == 0 ? 1 : num;    }}

倒序

public class IntegerImpl implements Comparator<Integer>{    @Override    public int compare(Integer o1, Integer o2) {        int num = o2 -o1;        return num == 0 ? 1 : num;    }}