特点:无序,唯一,这里的无序是相对list来说的,不是随机,
API:相对于list,没有索引的相关方法,
那么证明我们的遍历方法有:
(1)迭代器
(2)增强for循环
无序,唯一,我们会发现重复存放的元素,输出的时候只会有一个,那如何验证呢,add()是一个bool返回值方法,所以我们输出add方法来看看去呗
我们可以发现,第一次添加hello,的返回结果时true成功的,第二次重复的时候就是false失败的,
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());
}
自定义引用类型的数据:
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());
}
我自定义的类型不满足,唯一,无序的特点,为什么呢?
原因:我们的Student类没有重写hashCode和equals方法
@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的无序,唯一的特性了
底层与hashmap十分相似,下图是属性和构造器的分析
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/doomwatcher/article/details/121566729
内容来源于网络,如有侵权,请联系作者删除!