Java 集合:HashSet 与 hashCode、equals
Java 集合:HashSet 与 hashCode、equals
大家都说 Java 很简单,的确 Java 入门不难,但是要想深入了解 Java 那不是一朝一夕能够做到的!
学习 Java 最重要的一点是要学习其设计思想和设计理念,比如集合框架、IO框架的设计等。
通过一个实例谈谈 HashSet 与 hashCode、equals 的使用,以及在使用时的注意事项。
设计一个 Person 类,如下:
- package mark.zhang;
- public class Person {
- private String name;
- private int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "age=" + age + ", name=" + name;
- }
- }
这个类很简单,两个成员变量以及 set、get 方法,注意这里没有重写 equals、hashCode 方法。为了在打印的时候方便看出结果,重写 toString 方法。
测试类也照样很简单,如下:
- public class TestPerson {
- public static void main(String[] args) {
- Set<Person> set = new HashSet<Person>();
- Person p1 = new Person("喜洋洋", 25);
- Person p2 = new Person("懒洋洋", 26);
- Person p3 = new Person("灰太郎", 27);
- set.add(p1);
- set.add(p2);
- set.add(p3);
- System.out.println(set.size() + " 个动画人物!");
- for (Person person : set) {
- System.out.println(person);
- }
- }
- }
- 3 个动画人物!
- age=27, name=灰太郎
- age=26, name=懒洋洋
- age=25, name=喜洋洋
如果在代码中删除一个“人”,很简单,只需要调用 remove 方法即可,如下所示:
- set.remove(p2);
这个时候,我需要修改 Person 这个类,重写父类 Object 的两个方法,equals、hashCode,修改之后的代码:
- package mark.zhang;
- public class Person {
- private String name;
- private int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "age=" + age + ", name=" + name;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + age;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Person other = (Person) obj;
- if (age != other.age)
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
- }
|
评论暂时关闭