一,Set集合的特征
1,无序 (取出顺序与存入的顺序不一定相同);
2,值不能重复。

1,下面通过实例证明Set集合存取的无序性:
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王二");
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
打印结果:

2,接下来探讨Set集合是如何保证元素不重复的呢?并通过实例证明:
Set集合是通过hashCode方法和equals这2个方法来保证元素的唯一性的,判断两个元素是否相同首先要判断元素的hashCode值是否一致,只有在该值一致的情况下才会判断equals方法。如果存储在HashSet中的两个对象hashCode方法的值相同且equals方法返回的结果是也相同,那么Set的add(E)方法返回的boolean类型将会是false即存入失败。
字符串:使用HashSet添加字符串:
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("张三");
set.add("李四");
set.add("王二");
boolean isAdded = set.add("张三");
System.out.println("添加是否成功: " + isAdded);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
打印结果:

自定义对象:使用HashSet添加自定义对象(没有重写hashCode与equals方法):
public class Person {
private String name;
private Integer age;
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;
}
}
测试类:
public class SetTest {
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
set.add(new Person("张三", 20));
set.add(new Person("李四", 21));
set.add(new Person("王二", 22));
boolean isAdded = set.add(new Person("张三", 20));
System.out.println("添加无hashCode与equals方法对象是否成功: " + isAdded);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
打印结果:

自定义对象:使用HashSet添加自定义对象(有重写hashCode与equals方法):
public class Person {
private String name;
private Integer age;
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);
}
}
测试类:
public class SetTest {
public static void main(String[] args) {
Set<Person> set = new HashSet<>();
set.add(new Person("张三", 20));
set.add(new Person("李四", 21));
set.add(new Person("王二", 22));
boolean isAdded = set.add(new Person("张三", 20));
System.out.println("添加有hashCode与equals方法对象是否成功: " + isAdded);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
打印结果:

结论:重写Object的hashCode与equals方法可以避免我们往HashSet集合中加入相同的自定义对象。
完
1108

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



