集合類java.lang.StackOverflowError的問題

  1. ArrayList<Object> list = new ArrayList<Object>();  
  2. list.add(list);  
  3. HashSet<Object> set = new HashSet<Object>();  
  4. set.add(list);  
  5. //Exception in thread "main" java.lang.StackOverflowError  
  6. //                    at java.util.AbstractList$Itr.next(AbstractList.java:345)  
  7. //                    at java.util.AbstractList.hashCode(AbstractList.java:526)  
  8. //                    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)對象

相關文章
相關標籤/搜索