黑马程序员_HashCode与equals

时间:2021-07-01 16:48:23
 

-------------------------------------------------android培训java培训期待与您交流!----------------------------------

一、概述

1. 关于Object类的equals方法的特点

a) 自反性:x.equals(x)应该返回true

b) 对称性:x.equals(y)为true,那么y.equals(x)也为true。

c) 传递性:x.equals(y)为 true并且y.equals(z)为true,那么x.equals(z)也应该为true。

d) 一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次、第三次、第n次调用也应该为true,前提条件是在比较之间没有修改x也没有修改y。

e) 对于非空引用x,x.equals(null)返回false。

2. 关于Object类的hashCode()方法的特点:

a) 在Java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化)。

b) 对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。

c) 对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。

d) 对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode值表示的是对象的地址)。

3. 当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

4. 如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

 

public class HashCodeError {

    public static void main(String[] args) {

        Point p1=new Point(10, 10);

        Point p2=new Point(20, 20);

        Point p3=new Point(10,10);

        Set<Point> points=new HashSet<Point>();

        points.add(p1);

        points.add(p2);

        points.add(p3);

       

        System.out.println(points.size());

       

        p1.setX(15);//修改属性

        points.remove(p1);

        //对象未删除,内存泄漏,因为hashCode也变化了

        System.out.println(points.size());

    }

}

class Point

{

    private int x;

    private int y;

   

    public Point(int x, int y) {

        this.x = x;

        this.y = y;

    }

    @Override

    public int hashCode() {

        final int prime = 31;

        int result = 1;

        result = prime * result + x;

        result = prime * result + y;

        return result;

    }

    @Override

    public boolean equals(Object obj) {

        if (this == obj)

            return true;

        if (obj == null)

            return false;

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

            return false;

        Point other = (Point) obj;

        if (x != other.x)

            return false;

        if (y != other.y)

            return false;

        return true;

    }

    public int getX() {

        return x;

    }

    public void setX(int x) {

        this.x = x;

    }

    public int getY() {

        return y;

    }

    public void setY(int y) {

        this.y = y;

    }

   

}

 

 

 

-------------------------------------------------android培训java培训期待与您交流!----------------------------------

 详细请查看:http://edu.csdn.net/heima