You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by sc...@apache.org on 2011/04/12 17:13:37 UTC
svn commit: r1091448 - in /commons/proper/lang/trunk/src:
main/java/org/apache/commons/lang3/ObjectUtils.java
test/java/org/apache/commons/lang3/ObjectUtilsTest.java
Author: scolebourne
Date: Tue Apr 12 15:13:36 2011
New Revision: 1091448
URL: http://svn.apache.org/viewvc?rev=1091448&view=rev
Log:
LANG-692 - Add hashCodeMulti varargs method
Modified:
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java?rev=1091448&r1=1091447&r2=1091448&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java (original)
+++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/ObjectUtils.java Tue Apr 12 15:13:36 2011
@@ -189,9 +189,41 @@ public class ObjectUtils {
* @since 2.1
*/
public static int hashCode(Object obj) {
+ // hashCode(Object) retained for performance, as hash code is often critical
return (obj == null) ? 0 : obj.hashCode();
}
+ /**
+ * <p>Gets the hash code for multiple objects.</p>
+ *
+ * <p>This allows a hash code to be rapidly calculated for a number of objects.
+ * The hash code for a single object is the <em>not</em> same as {@link #hashCode(Object)}.
+ * The hash code for multiple objects is the same as that calculated by an
+ * {@code ArrayList} containing the specified objects.</p>
+ *
+ * <pre>
+ * ObjectUtils.hashCodeMulti() = 1
+ * ObjectUtils.hashCodeMulti((Object[]) null) = 1
+ * ObjectUtils.hashCodeMulti(a) = 31 + a.hashCode()
+ * ObjectUtils.hashCodeMulti(a,b) = (31 + a.hashCode()) * 31 + b.hashCode()
+ * ObjectUtils.hashCodeMulti(a,b,c) = ((31 + a.hashCode()) * 31 + b.hashCode()) * 31 + c.hashCode()
+ * </pre>
+ *
+ * @param first the first object, may be {@code null}
+ * @param objects the objects to obtain the hash code of, may be {@code null}
+ * @return the hash code of the objects, or zero if null
+ * @since 3.0
+ */
+ public static int hashCodeMulti(Object... objects) {
+ int hash = 1;
+ if (objects != null) {
+ for (int i = 0; i < objects.length; i++) {
+ hash = hash * 31 + ObjectUtils.hashCode(objects[i]);
+ }
+ }
+ return hash;
+ }
+
// Identity ToString
//-----------------------------------------------------------------------
/**
Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java?rev=1091448&r1=1091447&r2=1091448&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/ObjectUtilsTest.java Tue Apr 12 15:13:36 2011
@@ -18,9 +18,11 @@ package org.apache.commons.lang3;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
+import java.util.List;
import junit.framework.TestCase;
@@ -97,6 +99,30 @@ public class ObjectUtilsTest extends Tes
assertEquals("a".hashCode(), ObjectUtils.hashCode("a"));
}
+ public void testHashCodeMulti_multiple_emptyArray() {
+ Object[] array = new Object[0];
+ assertEquals(1, ObjectUtils.hashCodeMulti(array));
+ }
+
+ public void testHashCodeMulti_multiple_nullArray() {
+ Object[] array = null;
+ assertEquals(1, ObjectUtils.hashCodeMulti(array));
+ }
+
+ public void testHashCodeMulti_multiple_likeList() {
+ List<Object> list0 = new ArrayList<Object>(Arrays.asList());
+ assertEquals(list0.hashCode(), ObjectUtils.hashCodeMulti());
+
+ List<Object> list1 = new ArrayList<Object>(Arrays.asList("a"));
+ assertEquals(list1.hashCode(), ObjectUtils.hashCodeMulti("a"));
+
+ List<Object> list2 = new ArrayList<Object>(Arrays.asList("a", "b"));
+ assertEquals(list2.hashCode(), ObjectUtils.hashCodeMulti("a", "b"));
+
+ List<Object> list3 = new ArrayList<Object>(Arrays.asList("a", "b", "c"));
+ assertEquals(list3.hashCode(), ObjectUtils.hashCodeMulti("a", "b", "c"));
+ }
+
// /**
// * Show that java.util.Date and java.sql.Timestamp are apples and oranges.
// * Prompted by an email discussion.