Arrays.hashCode(Object [])与Objects.hash(Object…)
從JDK 1.5開始 , Arrays類提供了名為“ hashCode ”的重載static方法。 大多數重載方法都接受特定原始類型的數組,但是Arrays.hashCode(Object [])方法可用于計算引用類型數組的int哈希碼。 自從JDK 1.7誕生以來 , Objects類提供了一種名為hash(Object…)的方法,該方法還為提供的Java對象數組(表示Java varargs的省略號 [ ... ] 作為數組處理 )返回int哈希碼。 接受一個數組 )。 這篇文章提供了Arrays.hashCode(Object)和Objects.hash(Object...)之間的簡要比較。
我們可以查看OpenJDK中的代碼,以了解OpenJDK如何實現此處比較的兩種方法。 事實證明, Arrays.hashCode(Object[])和Objects.hash(Object...)行為完全相同,因為Objects.hash(Object...)完全委托給Arrays.hashCode(Object[]) 。 這是從OpenJDK Objects.java類提取的下一個代碼清單中顯示的。
public static int hash(Object... values) {return Arrays.hashCode(values); }因此,事實證明這些方法實際上是相同的,因此選擇哪種方法主要取決于口味。 鑒于無論如何都會調用Arrays方法,可能會吸引一些人直接使用它。 其他人可能更喜歡在將已知的Java數組構造傳遞給Arrays方法時使用Objects方法,而在以逗號分隔的組合形式傳遞值而無需顯式數組語法的情況下使用Objects方法(例如(例如,實現自定義類的hashCode()方法并將該類的任意類型的屬性傳遞給哈希代碼計算的情況)。 當使用相同類型的原語數組時,最好為該特定原語使用適當版本的Arrays.hashCode 。
下一個代碼清單(可在GitHub上找到)中顯示的簡單類演示了Arrays.hashCode和Objects.hash(Object...)方法的重載版本之間的輸出差異和相似之處。
package dustin.examples.hashcodes;import java.util.Arrays; import java.util.Objects;import static java.lang.System.out;/*** Demonstration that displays output to standard output with* hash codes generated for the same underlying array data by* both {@code Arrays.hashCode(Object[])} and by* {@code Objects.hash(Object...)}.*/ public class HashesComparedDemo {public static void main(final String[] arguments){final int[] integers = ArraysCreator.createArrayOfInts();out.println("Arrays.hashCode(Object[]) for int[]: " + Arrays.hashCode(integers));out.println("Objects.hash(Object...) for int[]: " + Objects.hash(integers));out.println("Objects.hashCode(Object) for int[]: " + Objects.hashCode(integers));final Integer[] refIntegers = ArraysCreator.createArrayOfIntegers();out.println("Arrays.hashCode(Object[]) for Integer[]: " + Arrays.hashCode(refIntegers));out.println("Objects.hash(Object...) for Integer[]: " + Objects.hash(refIntegers));out.println("Objects.hashCode(Object) for Integer[]: " + Objects.hashCode(refIntegers));final String[] strings = ArraysCreator.createArrayOfStrings();out.println("Arrays.hashCode(Object[]) for String[]: " + Arrays.hashCode(strings));out.println("Objects.hash(Object...) for String[]: " + Objects.hash(strings));out.println("Objects.hashCode(Object) for String[]: " + Objects.hashCode(strings));} }上面顯示的代碼將三個公共數據集(原始int值數組,參考Integer值數組和String值數組)傳遞給Arrays.hashCode , Objects.hash(Object...)和Objects.hashCode(Object)方法,該方法接受單個Object (整個數組符合條件)。 然后,簡單示例將每種方法為每個數據集生成的各個哈希碼值寫入標準輸出。 接下來顯示運行該代碼的結果。
Arrays.hashCode(Object[]) for int[]: 1722319241 Objects.hash(Object...) for int[]: 356573628 Objects.hashCode(Object) for int[]: 356573597 Arrays.hashCode(Object[]) for Integer[]: 1722319241 Objects.hash(Object...) for Integer[]: 1722319241 Objects.hashCode(Object) for Integer[]: 1735600054 Arrays.hashCode(Object[]) for String[]: 448603921 Objects.hash(Object...) for String[]: 448603921 Objects.hashCode(Object) for String[]: 21685669如我們所料, Arrays.hashCode(Object[])和Objects.hash(Object...)對于引用類型Integer和String返回相同的計算哈希碼,因為它們兩者實際上都是Arrays.hashCode(Object[]) 。 原始int值數組從Arrays.hashCode(int[])得出的結果與從Objects.hash(Object...)得出的結果不同,這當然是因為原始數組被傳遞給重載的Arrays.hashCode(int[])方法專門針對該原始數據類型而不是Arrays.hashCode(Object[]) 。
翻譯自: https://www.javacodegeeks.com/2018/09/arrays-hashcodeobject-versus-objects-hashobject.html
總結
以上是生活随笔為你收集整理的Arrays.hashCode(Object [])与Objects.hash(Object…)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑显卡730和950M(730显卡和1
- 下一篇: 58同城电脑版客户端(58同城电脑版)