Java基础之---- 集合(二)set

本文介绍了Java中的Set接口,它是Collection的子接口,不允许存储重复元素。讲解了HashSet、LinkedHashSet和TreeSet三个主要实现类的特点。HashSet基于Hash算法,不保证元素顺序,非线程安全;LinkedHashSet保持插入顺序;TreeSet基于红黑树,支持自然排序和自定义排序。

Collection子接口----Set接口

Set接口概述

  • Set接口是Collection的子接口,Set接口没有提供额外的方法。
  • Set集合不允许包含相同的元素,如果把两个相同的元素加入的Set集合中,则会添加操作失败。
  • Set判断两个对象是否相同,会调用equals()和hashCode()(对于HashSet来说)。
  • Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值
    由下图看set的继承结构
    在这里插入图片描述
    可以看出,Set主要有2个实现方式,一个是TreeSet,另一个是HashSet
    这个Set的特点,主要由其内部的Map决定的,可以负责任的说一句,Set就是Map的一个马甲

Set实现类之一HashSet

HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。
HashSet按照Hash算法来存储集合中的元素,因为具有很好的存取、查找、删除性能。、
HashSet具有以下特点:

  • 不能保证元素的排列顺序。
  • HashSet不是线程安全的。
  • 集合元素可以是null。
  • hashSet集合判断两个元素相等的标准:
  • 两个元素的hashCode()方法返回值相等。
  • 两个元素的equals()方法返回值也相等。
  • 对于存放在Set容器中的对象,对应的类一定要重写equals()方法和* hashCode()方法,以实现对象相等的原则。
    示例
package day18;

import java.util.Objects;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-06-22
 */
public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

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

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

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-06-18
 */
public class CollectionTest {
    public static void main(String[] args) {
        Person p1 = new Person("张三",60);
        Person p2 = new Person("张三",61);
        Person p3 = new Person("李四",16);
        Person p4 = new Person("张三",60);

        Set<Person> set = new HashSet<>();
        set.add(p1);
        set.add(p2);
        set.add(p3);
        set.add(p4);

        System.out.println("集合中的元素:" + set);
    }
}

Set实现类之一LinkedHashSet

  • LinkedHashSet是HashSet的子类。
  • LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入的顺序保存的,
  • LinkedHashSet插入性能要略低于HashSet,但在迭代访问Set里面的全部元素时有很好的性能。
  • LinkedHashSet不允许集合元素重复。
package day18;

import java.util.Objects;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-06-22
 */
public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

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

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * @motto: 一身转战三千里,一剑可当百万兵。
 * @author: 不为往事扰,余生只爱笑。
 * @version: 1.0
 * @since: 2019-06-18
 */
public class CollectionTest {
    public static void main(String[] args) {
        Person p1 = new Person("张三",60);
        Person p2 = new Person("张三",61);
        Person p3 = new Person("李四",16);
        Person p4 = new Person("张三",60);

        Set<Person> set = new LinkedHashSet<>();
        set.add(p1);
        set.add(p2);
        set.add(p3);
        set.add(p4);

        System.out.println("集合中的元素:" + set);
    }
}

Set实现类之一TreeSet

  • TreeSet底层是红黑树。
  • TreeSet主要实现的功能有自然排序和自定义排序。
    红-黑树
    红黑树是一种特定类型的二叉树

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值