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主要实现的功能有自然排序和自定义排序。
红-黑树
红黑树是一种特定类型的二叉树

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

被折叠的 条评论
为什么被折叠?



