set接口
特点:无序,唯一,这里的无序是相对list来说的,不是随机,
API:相对于list,没有索引的相关方法,
那么证明我们的遍历方法有:
(1)迭代器
(2)增强for循环
hashset实现类使用
无序,唯一,我们会发现重复存放的元素,输出的时候只会有一个,那如何验证呢,add()是一个bool返回值方法,所以我们输出add方法来看看去呗
我们可以发现,第一次添加hello,的返回结果时true成功的,第二次重复的时候就是false失败的,
代码语言:javascript复制 public static void main(String[] args) {
HashSet<String> hs = new HashSet<>();
System.out.println(hs.add("hello")); //true
hs.add("hello");
hs.add("hi");
hs.add("html");
hs.add("apple");
hs.add("hello");
System.out.println(hs.add("hello"));//false
System.out.println(hs);
System.out.println(hs.size());
}
自定义引用类型的数据:
代码语言:javascript复制 public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
hs.add(new Student("小丽",19));
hs.add(new Student("小hu",29));
hs.add(new Student("小Li",39));
hs.add(new Student("小tian",49));
hs.add(new Student("小丽",19));
System.out.println(hs.toString());
}
我自定义的类型不满足,唯一,无序的特点,为什么呢?
HashSet简要原理图
原因:我们的Student类没有重写hashCode和equals方法
代码语言:javascript复制 @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
name.equals(student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
重写之后,就符合HashSet的无序,唯一的特性了
hashSet原理:
底层与hashmap十分相似,下图是属性和构造器的分析