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 ==