4721 return 0; |
4721 return 0; |
4722 |
4722 |
4723 int result = 1; |
4723 int result = 1; |
4724 |
4724 |
4725 for (Object element : a) { |
4725 for (Object element : a) { |
4726 int elementHash = 0; |
4726 final int elementHash; |
4727 if (element instanceof Object[]) |
4727 final Class<?> cl; |
|
4728 if (element == null) |
|
4729 elementHash = 0; |
|
4730 else if ((cl = element.getClass().getComponentType()) == null) |
|
4731 elementHash = element.hashCode(); |
|
4732 else if (element instanceof Object[]) |
4728 elementHash = deepHashCode((Object[]) element); |
4733 elementHash = deepHashCode((Object[]) element); |
4729 else if (element instanceof byte[]) |
4734 else |
4730 elementHash = hashCode((byte[]) element); |
4735 elementHash = primitiveArrayHashCode(element, cl); |
4731 else if (element instanceof short[]) |
|
4732 elementHash = hashCode((short[]) element); |
|
4733 else if (element instanceof int[]) |
|
4734 elementHash = hashCode((int[]) element); |
|
4735 else if (element instanceof long[]) |
|
4736 elementHash = hashCode((long[]) element); |
|
4737 else if (element instanceof char[]) |
|
4738 elementHash = hashCode((char[]) element); |
|
4739 else if (element instanceof float[]) |
|
4740 elementHash = hashCode((float[]) element); |
|
4741 else if (element instanceof double[]) |
|
4742 elementHash = hashCode((double[]) element); |
|
4743 else if (element instanceof boolean[]) |
|
4744 elementHash = hashCode((boolean[]) element); |
|
4745 else if (element != null) |
|
4746 elementHash = element.hashCode(); |
|
4747 |
4736 |
4748 result = 31 * result + elementHash; |
4737 result = 31 * result + elementHash; |
4749 } |
4738 } |
4750 |
4739 |
4751 return result; |
4740 return result; |
|
4741 } |
|
4742 |
|
4743 private static int primitiveArrayHashCode(Object a, Class<?> cl) { |
|
4744 return |
|
4745 (cl == byte.class) ? hashCode((byte[]) a) : |
|
4746 (cl == int.class) ? hashCode((int[]) a) : |
|
4747 (cl == long.class) ? hashCode((long[]) a) : |
|
4748 (cl == char.class) ? hashCode((char[]) a) : |
|
4749 (cl == short.class) ? hashCode((short[]) a) : |
|
4750 (cl == boolean.class) ? hashCode((boolean[]) a) : |
|
4751 (cl == double.class) ? hashCode((double[]) a) : |
|
4752 // If new primitive types are ever added, this method must be |
|
4753 // expanded or we will fail here with ClassCastException. |
|
4754 hashCode((float[]) a); |
4752 } |
4755 } |
4753 |
4756 |
4754 /** |
4757 /** |
4755 * Returns {@code true} if the two specified arrays are <i>deeply |
4758 * Returns {@code true} if the two specified arrays are <i>deeply |
4756 * equal</i> to one another. Unlike the {@link #equals(Object[],Object[])} |
4759 * equal</i> to one another. Unlike the {@link #equals(Object[],Object[])} |