美文网首页
hashCode方法优化

hashCode方法优化

作者: 最美是夫诸 | 来源:发表于2019-03-19 09:16 被阅读0次

    如果让hashCode()方法返回一个固定值,那么每个新添加的元素都要调用equals(Object obj)方法比较,那么效率较低

       只需要让不同属性的值的元素产生不同的哈希值,那么就可以不再调用equals方法比较提高效率

    public class Person {

    String name;

    int age;

    public Person(String name,int age) {

    this.name = name;

    this.age = age;

    }

    @Override

    public String toString() {

    return "Person [name=" + name + ", age=" + age + "]";

    }

    @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;

    }

    /*

    @Override

    public int hashCode() {

    * 我们发现当hashCode方法永远返回整数1时,所有对象的hash值都是一样的,

    * 有一些对象他的成员变量完全不同,但是他们还需要进行hash和equals方法的比较,

    * 如果我们可以让成员变量不同的对象,他们的hash值也不同,这就可以减少一部分equals方法的比较

    * 从而可以提高我们程序的效率

    * 可以尝试着让hashCode方法的返回值和对象的成员变量有关

    * 可以让hashCode方法返回所有成员变量之和,

    * 让基本数据类型直接想加,然后引用数据类型获取hashCode方法返回值后再相加(boolean不可以参与运算)

    //return age;

    return age + name.hashCode();

    }

    @Override

    public boolean equals(Object obj) {

    System.out.println("-------------");

    //提高效率

    if(this == obj) {

    return true;

    }

    //提高健壮性

    if(this.getClass() != obj.getClass()) {

    return false;

    }

    //向下转型

    Person p = (Person)obj;

    if(!this.name.equals(p.name)) {

    return false;

    }

    if(this.age != p.age) {

    return false;

    }

    return true;

    }*/

    }

    package com.itheima_02;

    import java.util.HashSet;

    public class HashSetDemo3 {

    public static void main(String[] args) {

    //创建集合对象

    HashSet hs =new HashSet<Person>();

    //创建元素对象

    Person p =new Person("zhangsan",18);

    Person p2 =new Person("lisi",18);

    Person p3 =new Person("lisi",18); 

    //添加元素对象

    hs.add(p);

    hs.add(p2);

    hs.add(p3);

    //遍历集合对象

    for (Person person : hs) {

    System.out.println(person);

    }

    }

    }

    相关文章

      网友评论

          本文标题:hashCode方法优化

          本文链接:https://www.haomeiwen.com/subject/yxmwmqtx.html