码迷,mamicode.com
首页 > 其他好文 > 详细

hashcode-equals方法

时间:2017-07-18 23:17:31      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:ack   add   ring   继承   算法   boolean   父类   set   com   

package com.charles.collection;

import java.util.HashSet;
import java.util.Set;

public class Point {
    /**
     * @author Charles
     * @desc introduce hashcode and equals methods
     */

    private Integer x;
    private Integer y;

    public Point() {
    }

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        /*如果不重写equals方法,one与two对象就不相等,这是因为Point类
         * 默认继承父类Object的equals方法,而Object类的equals方法
         * 比较的是引用相等
         */
        Point one = new Point(3,3);
        Point two = new Point(3,3);
        if(one.equals(two)){
            System.out.println("one equals two..");
        }else{
            System.out.println("one NOT equals two..");//注释掉当前类的equals方法,可输出该结果
        }
        
        /*
         * 这些又与hashcode方法有什么关系呢?实际上如果Point类不参与
         * 与hash算法相关的存储运算,重写hashcode方法是没有必要的。
         */
        
        Set<Point> sets = new HashSet<Point>();
        sets.add(one);
        sets.add(two);
        //注释掉hashcode与equals方法,输出结果:2;否则为1, 原因是对象one与two的hash值相等,且相互equals,先放进set集合中的对象被后者覆盖了
        System.out.println(sets.size()); 
        /*
         * 猜猜留下的那个唯一对象是谁呢?
         * 测试方法可用==判断
         */
        if(one == sets.iterator().next()){
            System.out.println("Yeah, one left~~");
        }else if(one == sets.iterator().next()){
            System.out.println("Oh, two left~~");
        }
        
        //实际结果是one,这是因为当set集合中已经存在,hashcode与equals相等的元素时,便不再将当前元素放入集合了,这也可以通过add方法的返回值检测
    }

    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }

    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((x == null) ? 0 : x.hashCode());
        result = prime * result + ((y == null) ? 0 : y.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;
        Point other = (Point) obj;
        if (x == null) {
            if (other.x != null)
                return false;
        } else if (!x.equals(other.x))
            return false;
        if (y == null) {
            if (other.y != null)
                return false;
        } else if (!y.equals(other.y))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Point [x=" + x + ", y=" + y + "]";
    }

}

 

hashcode-equals方法

标签:ack   add   ring   继承   算法   boolean   父类   set   com   

原文地址:http://www.cnblogs.com/julygift/p/7203208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!