- ArrayList<Object> list = new ArrayList<Object>();
- list.add(list);
- HashSet<Object> set = new HashSet<Object>();
- set.add(list);
- //Exception in thread "main" java.lang.StackOverflowError
- // at java.util.AbstractList$Itr.next(AbstractList.java:345)
- // at java.util.AbstractList.hashCode(AbstractList.java:526)
- // at java.util.AbstractList.hashCode(AbstractList.java:527)
結果測試時就冒出了StackOverflowError錯誤,是因爲間接調用AbstractList的hashCode方法引發的。查看Java的API文檔,AbstractList的hashCode是把每個子元素的hashCode通過迭代計算獲得的,也就是說,要計算AbstractList的hashCode,就要把每個子元素的hashCode先計算一遍,若是這些子元素中的某一個或子元素的子元素引用到上級對象,那麼hashCode方法就會出現無限遞歸調用,最終出現StackOverflowError錯誤。java
經檢查,不光是List,其餘集合對象,如Map、Set、Stack等也有這個問題,即他們的hashCode也是經過計算子元素的hashCode獲得的。也就是說,不管是List,仍是Map、Set,只要內部出現了循環引用,如一個List引用了一個Map,Map又引用了頂層的List,調用hashCode方法就會致使堆棧溢出錯誤測試
public static void main(String[] args) {
Map map = new HashMap();
map.put(map, map);
map.put(map, map);
}spa
Exception in thread "main" java.lang.StackOverflowError
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)
at java.util.Objects.hashCode(Objects.java:98)
at java.util.HashMap$Node.hashCode(HashMap.java:296)
at java.util.AbstractMap.hashCode(AbstractMap.java:507)對象