Java中AbstractList hashCode()方法的示例
在Java中,AbstractList是一個抽象類,繼承自AbstractCollection類,實現了List接口。愛掏網 - it200.com它是實現List的骨干類,為其子類提供了一個默認的實現。愛掏網 - it200.com在AbstractList中,除了實現了List接口的一系列方法外,還有一個hashCode()方法,我們今天就來介紹一下這個方法。愛掏網 - it200.com
AbstractList中的hashCode()方法是這樣定義的:
public int hashCode() {
int h = 1;
for (E e : this)
h = 31 * h + (e==null ? 0 : e.hashCode());
return h;
}
從這段代碼中可以看出,AbstractList的hashCode()方法是通過遍歷列表中的元素計算出來的。愛掏網 - it200.com
首先,將h初始化為1。愛掏網 - it200.com
然后,遍歷列表中的元素,對于每個元素,將它的hashCode()值與h相乘(31 * h),然后再加上這個元素的hashCode()值(e.hashCode()),以此來計算出這個元素對最終hashCode()值的貢獻。愛掏網 - it200.com
如果元素是null,則將這個元素的貢獻設為0。愛掏網 - it200.com
最后,返回計算出來的hashCode()值。愛掏網 - it200.com
示例代碼
接下來,我們來看一個示例,展示AbstractList的hashCode()方法的實際應用。愛掏網 - it200.com
import java.util.AbstractList;
import java.util.Arrays;
public class MyList<E> extends AbstractList<E> {
private E[] array;
public MyList(E... array) {
if (array == null) {
throw new NullPointerException();
}
this.array = array;
}
public E get(int index) {
return array[index];
}
public int size() {
return array.length;
}
public int hashCode() {
int h = 1;
for (E e : this)
h = 31 * h + (e==null ? 0 : e.hashCode());
return h;
}
public static void main(String[] args) {
MyList<String> list1 = new MyList<>("a", "b", "c");
MyList<String> list2 = new MyList<>("a", "b", "c");
MyList<String> list3 = new MyList<>("a", "b", "d");
System.out.println(list1.hashCode()); // 輸出:975078
System.out.println(list2.hashCode()); // 輸出:975078
System.out.println(list3.hashCode()); // 輸出:975079
}
}
這里定義了一個自定義的MyList類,它繼承自AbstractList類,并且實現了List接口中的get()和size()方法,以及AbstractList中的hashCode()方法。愛掏網 - it200.com
在main()方法中,我們創建了3個MyList實例,它們的元素相同,但是有一個元素不同。愛掏網 - it200.com
我們分別輸出這三個實例的hashCode()值,可以發現,list1和list2的hashCode()值相同,而list3的hashCode()值不同。愛掏網 - it200.com這是因為list1和list2中的元素都是相同的,所以它們的hashCode()值相同,而list3中的元素與list1和list2中的元素不同,所以它們的hashCode()值不同。愛掏網 - it200.com
結論
通過上述示例可以看出,AbstractList的hashCode()方法是通過遍歷列表中的元素計算出來的,并且保證相同的元素生成的hashCode()值也相同。愛掏網 - it200.com這個方法在實現自定義的List子類時也是非常有用的,可以方便地實現自己的hashCode()方法。愛掏網 - it200.com