/** * */ package cn.fsf.annotation; /** * this class shows that how to write a proper hashCode() * * @author FSF * */ public class HashCodeExample { private boolean aBoolean = true; private byte aByte = 1; private char aChar = 'd'; private int aInt = 10; private long aLong = 30; private float aFloat = 89; private double aDouble = 90.34; private String aStr = "test"; private String[] aArray = { "df", "cs" }; @Override public int hashCode() { int lResult = 17; // first step,collect all usefull fields hashCode in a proper way, // the principle is that the code must generate fast and simple int lBooleanCode = aBoolean ? 1 : 0; int lByteCode = aByte; int lCharCode = aChar; int lIntCode = aInt; int lLongCode = (int) (aLong ^ (aLong >>> 32)); int lFloatCode = Float.floatToIntBits(aFloat); long lDoubleCodeTemp = Double.doubleToLongBits(aDouble); int lDoubleCode = (int) (lDoubleCodeTemp ^ (lDoubleCodeTemp >>> 32)); int lStrCode = aStr.hashCode(); int lArrayCode = 0; if (aArray != null && aArray.length > 0) { for (int i = 0; i < aArray.length; i++) { lArrayCode += aArray[i].hashCode(); } } // get the sum of them int lSumCode = lBooleanCode + lByteCode + lCharCode + lIntCode + lLongCode + lFloatCode + lDoubleCode + lStrCode + lArrayCode; // generate the hashCode lResult = 31 * lResult + lSumCode; return lResult; } public static void main(String[] args) { HashCodeExample lExample = new HashCodeExample(); System.out.println(lExample.hashCode()); } }