簡體   English   中英

Java-equals()和hashCode()實現

[英]Java - equals() and hashCode() implementation

我有一個PointDensity類,它實現為:

import java.sql.Date;

public class PointDensity {

    private int id_place;

    private String algorithm;

    private Date mission_date;

    private int mission_hour;

    private int x;

    private int y;

    public PointDensity(int id_place, String algorithm, Date mission_date, int mission_hour, int x, int y) {

        this.id_place = id_place;
        this.algorithm = algorithm;
        this.mission_date = mission_date;
        this.mission_hour = mission_hour;
        this.x = x;
        this.y = y;
    }


    @Override
    public boolean equals(Object obj){
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PointDensity other = (PointDensity) obj;
        return id_place == other.id_place
            && algorithm.equals(other.algorithm) 
            && mission_date.equals(other.mission_date)

            && mission_hour == other.mission_hour
            && x == other.x
            && y== other.y;
    }

    @Override
    public int hashCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result + y;
        result = prime * result + ((algorithm == null) ? 0 : algorithm.hashCode());
        result = prime * result + x;
        result = prime * result + ((mission_date == null) ? 0 : mission_date.toString().hashCode());
        result = prime * result + mission_hour;
        result = prime * result + id_place;
        return result;
    }
}

我讀了一些東西,並從數據庫中獲取值。 然后,我想使用HashMap()來將PointDensity對象存儲為鍵,並將其遇到的時間存儲為一個值。 但是,它永遠不會發現對象是相同的。

    Map<PointDensity, Integer> pointDensities = new HashMap<>();
    while (resultSet.next()){
        PointDensity pointDensity = 
            new PointDensity(
                resultSet.getInt(1), 
                resultSet.getString(2),
                new Date(timestampValues.getLong(i)), 
                new java.util.Date(timestampValues.getLong(i)).getHours(),
                xValues.getInt(i), 
                yValues.getInt(i)
            );  
        if (pointDensities.containsKey(pointDensity)){
            //IT NEVER ENTERS HERE!!!
            System.out.println("exists");
            int times = pointDensities.get(pointDensity);
            pointDensities.replace(pointDensity, times++);
        }else{
            pointDensities.put(pointDensity, 1);
        }
    }        

提前致謝 :)

以下代碼對我hashcode ,您的hashcodeequals方法似乎正常。 錯誤必須出在您未顯示給我們的代碼中,或者出在數據庫數據本身中。

    public static void main( String[] args ) {
       Map<PointDensity, Integer> pointDensities = new HashMap<>();
       PointDensity pointDensity = new PointDensity( 10, "TEST",
               new Date( 3, 1, 2019 ), new java.util.Date().getHours(),
               42, 24 );
       pointDensities.put( pointDensity, 1 );
       System.out.println( "pointDensity equal to self:"
               + pointDensity.equals( pointDensity ) );
       if( pointDensities.containsKey( pointDensity ) ) {

          //IT NEVER ENTERS HERE!!!
          System.out.println( "exists" );
          int times = pointDensities.get( pointDensity );
          pointDensities.replace( pointDensity, times++ );
       } else {
          pointDensities.put( pointDensity, 1 );
       }
    }
}

輸出:

run:
pointDensity equal to self:true
exists
BUILD SUCCESSFUL (total time: 0 seconds)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM