Mega Code Archive

 
Categories / Java / Development Class
 

Null Safe Equals and Hash

/*  * Copyright 2002-2007 the original author or authors.  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ //package net.gqu.utils; import java.lang.reflect.Array; import java.util.Arrays; /**  * Miscellaneous object utility methods. Mainly for internal use within the  * framework; consider Jakarta's Commons Lang for a more comprehensive suite  * of object utilities.  *  * @author Juergen Hoeller  * @author Keith Donald  * @author Rod Johnson  * @author Rob Harrop  * @author Alex Ruiz  * @since 19.03.2004  * @see org.apache.commons.lang.ObjectUtils  */ public abstract class ObjectUtils {   private static final int INITIAL_HASH = 7;   private static final int MULTIPLIER = 31;   /**    * Determine if the given objects are equal, returning <code>true</code>    * if both are <code>null</code> or <code>false</code> if only one is    * <code>null</code>.    * <p>Compares arrays with <code>Arrays.equals</code>, performing an equality    * check based on the array elements rather than the array reference.    * @param o1 first Object to compare    * @param o2 second Object to compare    * @return whether the given objects are equal    * @see java.util.Arrays#equals    */   public static boolean nullSafeEquals(Object o1, Object o2) {     if (o1 == o2) {       return true;     }     if (o1 == null || o2 == null) {       return false;     }     if (o1.equals(o2)) {       return true;     }     if (o1 instanceof Object[] && o2 instanceof Object[]) {       return Arrays.equals((Object[]) o1, (Object[]) o2);     }     if (o1 instanceof boolean[] && o2 instanceof boolean[]) {       return Arrays.equals((boolean[]) o1, (boolean[]) o2);     }     if (o1 instanceof byte[] && o2 instanceof byte[]) {       return Arrays.equals((byte[]) o1, (byte[]) o2);     }     if (o1 instanceof char[] && o2 instanceof char[]) {       return Arrays.equals((char[]) o1, (char[]) o2);     }     if (o1 instanceof double[] && o2 instanceof double[]) {       return Arrays.equals((double[]) o1, (double[]) o2);     }     if (o1 instanceof float[] && o2 instanceof float[]) {       return Arrays.equals((float[]) o1, (float[]) o2);     }     if (o1 instanceof int[] && o2 instanceof int[]) {       return Arrays.equals((int[]) o1, (int[]) o2);     }     if (o1 instanceof long[] && o2 instanceof long[]) {       return Arrays.equals((long[]) o1, (long[]) o2);     }     if (o1 instanceof short[] && o2 instanceof short[]) {       return Arrays.equals((short[]) o1, (short[]) o2);     }     return false;   }   /**    * Return as hash code for the given object; typically the value of    * <code>{@link Object#hashCode()}</code>. If the object is an array,    * this method will delegate to any of the <code>nullSafeHashCode</code>    * methods for arrays in this class. If the object is <code>null</code>,    * this method returns 0.    * @see #nullSafeHashCode(Object[])    * @see #nullSafeHashCode(boolean[])    * @see #nullSafeHashCode(byte[])    * @see #nullSafeHashCode(char[])    * @see #nullSafeHashCode(double[])    * @see #nullSafeHashCode(float[])    * @see #nullSafeHashCode(int[])    * @see #nullSafeHashCode(long[])    * @see #nullSafeHashCode(short[])    */   public static int nullSafeHashCode(Object obj) {     if (obj == null) {       return 0;     }     if (obj instanceof Object[]) {       return nullSafeHashCode((Object[]) obj);     }     if (obj instanceof boolean[]) {       return nullSafeHashCode((boolean[]) obj);     }     if (obj instanceof byte[]) {       return nullSafeHashCode((byte[]) obj);     }     if (obj instanceof char[]) {       return nullSafeHashCode((char[]) obj);     }     if (obj instanceof double[]) {       return nullSafeHashCode((double[]) obj);     }     if (obj instanceof float[]) {       return nullSafeHashCode((float[]) obj);     }     if (obj instanceof int[]) {       return nullSafeHashCode((int[]) obj);     }     if (obj instanceof long[]) {       return nullSafeHashCode((long[]) obj);     }     if (obj instanceof short[]) {       return nullSafeHashCode((short[]) obj);     }     return obj.hashCode();   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(Object[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + nullSafeHashCode(array[i]);     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(boolean[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + hashCode(array[i]);     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(byte[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + array[i];     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(char[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + array[i];     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(double[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + hashCode(array[i]);     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(float[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + hashCode(array[i]);     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(int[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + array[i];     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(long[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + hashCode(array[i]);     }     return hash;   }   /**    * Return a hash code based on the contents of the specified array.    * If <code>array</code> is <code>null</code>, this method returns 0.    */   public static int nullSafeHashCode(short[] array) {     if (array == null) {       return 0;     }     int hash = INITIAL_HASH;     int arraySize = array.length;     for (int i = 0; i < arraySize; i++) {       hash = MULTIPLIER * hash + array[i];     }     return hash;   }   /**    * Return the same value as <code>{@link Boolean#hashCode()}</code>.    * @see Boolean#hashCode()    */   public static int hashCode(boolean bool) {     return bool ? 1231 : 1237;   }   /**    * Return the same value as <code>{@link Double#hashCode()}</code>.    * @see Double#hashCode()    */   public static int hashCode(double dbl) {     long bits = Double.doubleToLongBits(dbl);     return hashCode(bits);   }   /**    * Return the same value as <code>{@link Float#hashCode()}</code>.    * @see Float#hashCode()    */   public static int hashCode(float flt) {     return Float.floatToIntBits(flt);   }   /**    * Return the same value as <code>{@link Long#hashCode()}</code>.    * @see Long#hashCode()    */   public static int hashCode(long lng) {     return (int) (lng ^ (lng >>> 32));   } }