关键词搜索

源码搜索 ×
×

一篇文章带你搞懂 Java 中的 Set 接口

发布2020-02-14浏览814次

详情内容

一、Set 接口的定义

Set 接口也是 Collection 接口的子接口,但是与 Collection 或者 List 接口不同,Set接口不能加入重复的元素。

public interface Set<E> extends Collection<E>

    Set 接口主要方法与 Collection 接口一致,并没有对其进行扩充,只是比 Collection 接口的要求更加严格,不能增加重复的元素

    Set 接口的实例无法像 List 接口进行双向输出,因为此接口没有提供像 List 接口定义的 get(int index)方法

    二、Set 接口的常用子类

    1. 散列的存放:HashSet

    HashSet 是 Set 接口的一个子类,主要特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序

    import java.util.HashSet;
    import java.util.Set;
    
    public class Test{
        public static void main(String[] args) {
            Set<String> allSet = new HashSet<String >();
            allSet.add("A");
            allSet.add("B");
            allSet.add("B");//重复元素,不能加入
            allSet.add("C");
            System.out.println(allSet);//输出集合对象,调用 toString()
        }
    }
    
      2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    结果可以看出,对于重复元素只会增加一次,而且程序运行时向集合中加入元素的顺序并不是集合中的保存顺序,HashSet 类中的元素时无序排列的

    2. 有序的存放:TreeSet

    如果想对输入的数据有序排列,需要使用 TreeSet 子类。TreeSet 类的定义:

    public class TreeSet<E> extends AbstractSet<E> implements SortedSet<E>,
    Cloneable,Seriallizable
    
      2

    TreeSet 类也是继承了 AbstractSet 类,此类的定义如下:

    public abstract class AbstractSet<E> extends AbstractCollection<E> 
    implements Set<E>
    
      2
    import java.util.Set;
    import java.util.TreeSet;
    
    public class Test{
        public static void main(String[] args) {
            Set<String> allSet = new TreeSet<String >();
            allSet.add("D");
            allSet.add("B");
            allSet.add("B");//重复元素,不能加入
            allSet.add("C");
            allSet.add("D");//重复元素,不能加入
            allSet.add("A");
            System.out.println(allSet);//输出集合对象,调用 toString()
        }
    }
    
      2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    向集合中插入数据时是没有顺序的,但是输出之后数据是有序的,所以 TreeSet 是可以排序的子类。

    3. 自定义类排序

    通过覆写 equals() 方法和 hashCode() 方法去掉集合中的重复

    import java.util.HashSet;
    import java.util.Set;
    
    class Person{
        private String name;
        private int age;
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }
        public boolean equals(Object obj){//覆写 equals() 方法
            if (this == obj){//地址相同
                return true;//是同一个对象
            }
            if (!(obj instanceof Person)){//传递进来的不是本类的对象
                return false;//不是同一个对象
            }
            Person p = (Person)obj;//进行向下转型
            if (this.name.equals(p.name) && this.age == p.age) {
                return true;//属性一次比较
            }else {//全部属性相等是同一个对象
                return false;//属性不相等,不是同一个对象
            }
        }
        public int hashCode(){//覆写 hashCode() 方法
            return this.name.hashCode() * this.age;//指定编码公式
        }
        public String toString(){//覆写 toString() 方法
            return "姓名:" + this.name + ";年龄:" + this.age;
        }
    }
    public class Test{
        public static void main(String[] args) {
            Set<Person> allSet = new HashSet<Person>();//实例化 Set 接口对象
            allSet.add(new Person("张三",30));//加入元素
            allSet.add(new Person("李四",31));//加入元素
            allSet.add(new Person("王五",32));//加入元素
            allSet.add(new Person("王五",32));//重复元素,不能加入元素
            allSet.add(new Person("赵六",33));
            allSet.add(new Person("孙七",33));//年龄重复
            System.out.println(allSet);
        }
    }
    
      2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载