java集合框架————Set集合接口

Set接口与List接口最大的不同在于Set接口中的内容是不允许重复的。同时需要注意的是,Set接口并没有对Collection接口进行扩充,而List对Collection进行了扩充。因此,在Set接口中没有get()方法。

在Set子接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)

1.set接口常用字类

在这里插入图片描述

范例:观察HashSet使用

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

public class HashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("hello");
        set.add("I'm");
        set.add("fish");
        set.add("hey");
        set.add("Fish");
        System.out.println(set);

    }
}

范例:观察TreeSet使用

import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    public static void main(String[] args) {

        Set<String> set = new TreeSet<>();
        set.add("hey");
        set.add("Hey");
        set.add("I'm");
        set.add("Fish");
        set.add("fish");
        System.out.println(set);
    }

}

TreeSet使用的是升序排列的模式完成的。

2.TreeSet排序分析

既然TreeSet子类可以进行排序,所以我们可以利用TreeSet实现数据的排列处理操作。此时要想进行排序实际上是针对于对象数组进行的排序处理,而如果要进行对象数组的排序,对象所在的类一定要实现Comparable接口并且覆写compareTo()方法,只有通过此方法才能知道大小关系。

需要提醒的是如果现在试用Comparable接口进行大小关系匹配,所有属性必须全部进行比较操作。

范例:使用TreeSet排序

import java.util.Set;
import java.util.TreeSet;

class Person implements Comparable<Person>{
    private String name;
    private Integer age;


    @Override
    public String toString() {
        return "Person{" +
                "name=" + name +
                ", age=" + age +
                '}';
    }

    public int compareTo(Person o){
        if(this.age > o.age){
            return 1;
        }else if(this.age < o.age){
            return -1;
        }else {
            return this.name.compareTo(o.name);
        }
    }
    public Person(String name, Integer age){
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}



public class TreeSetDemo1 {

    public static void main(String[] args) {
        Set<Person> set = new TreeSet<>();
        set.add(new Person("张三",20));
        set.add(new Person("王五",15));
        set.add(new Person("赵四",18));
        System.out.println(set);

    }
}

在这里插入图片描述

在实际使用之中,使用TreeSet过于麻烦了。项目开发之中,简单java类是根据数据表设计得来的,如果一个类的属性很多,那么比较起来就很麻烦了。所以我们一般使用的是HashSet。

3.重复元素判断

在使用TreeSet子类进行数据保存的时候,重复元素的判断依靠的ComParable接口完成的。但是这并不是全部Set接口判断重复元素的方式,因为如果使用的是HashSet子类,由于其跟Comparable没有任何关系,所以它判断重复元素的方式依靠的是Object类中的两个方法:

  1. hash码: public native int hashCode();
  2. 对象比较:public boolean equals(Object obj);

在Java中进行对象比较的操作有两步:第一步要通过一个对象的唯一编码找到一个对象的信息,当编码匹配之后再调用equals()方法进行内容的比较。

范例:覆写hashCode()与equals()方法消除重复
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果要想标识出对象的唯一性,一定需要equals()与hashCode()方法共同调用。
面试题:如果两个对象的hashCode()相同,equals()不同结果是什么?不能消除
面试题:如果两个对象的hashCode()不同,equals()相同结果是什么?不能消除

对象判断必须两个方法equals()、hashCode()返回值都相同才判断为相同。

个人建议:

  1. 保存自定义对象的时候使用List接口;
  2. 保存系统类信息的时候使用Set接口(避免重复)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章