set接口简述:元素无序 且 不允许有重复元素。Set接口和List接口继承自Collection接口。
向HashSet存入对象时,对象一般会重写hashCode()和equals()方法。
代码演示:
此时存储并输出了两个一样的。因为没有重写hashCold()和equal()方法。
import java.util.HashSet; import java.util.Iterator; public class HashSetDemo { public static void main(String[] args) { //创建HashSet对象 HashSet hs=new HashSet(); //给集合中添加自定义对象. hs.add(new Student("李白",21)); hs.add(new Student("杜甫",19)); hs.add(new Student("张飞",22)); hs.add(new Student("李白",21));//存储了两个“李白” //取出集合中的每个元素 Iterator it=hs.iterator(); while (it.hasNext()){ Student s=(Student)it.next(); System.out.println(s); }
学生类: public class Student {
private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override //重写String方法,利于输出完整的String量。ALT+insert键选择to String public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; //此时从上到这,没有重写hashCold()和equal()方法。所以HashSet集合可以存储一样的元素 此时输出:
Student{name='李白', age=21}
Student{name='张飞', age=22}
Student{name='杜甫', age=19}
Student{name='李白', age=21} //此时存储并输出了两个一样的。元素重复了
///////////////////////////////////////////////////////////////////////////////////////////
@Override //ALT+insert键选择 hashCold()和equal(),直接默认下一步就行了。
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 && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); } //此时到这,以经重写hashCold()和equal()方法。
此时输出:
E:\Files\java11\bin\java.exe "-javaagent:E:\Files\Idea\IntelliJ IDEA 2018.2.2\lib\idea_rt.jar=57273:E:\Files\Idea\IntelliJ IDEA 2018.2.2\bin" -Dfile.encoding=UTF-8 -classpath E:\Files\Idea\javacold\out\production\demo01 com.libai.www.HashSetDemo
Student{name='李白', age=21}
Student{name='杜甫', age=19}
Student{name='张飞', age=22} //李白这个元素此时不能重复
Process finished with exit code 0
} }