無意識的遞迴
在我們寫程式的時候經常會用到toString()的方法,但是這種方法有時候會造成無意識的遞迴。下面看程式碼:
import java.util.ArrayList;
import java.util.List;
/**
* Created by msc on 2017/1/8.
*/
public class InfiniteRecursion {
@Override
public String toString() {
return "InfiniteRecursion address: "+this+"\n";
}
public static void main(String[] args) {
List<InfiniteRecursion> v=new ArrayList<InfiniteRecursion>();
for (int i=0;i<10;i++){
v.add(new InfiniteRecursion());
}
System.out.println(v);
}
}
刪除程式碼的toString()方法是列印InfiniteRecursion類的物件的記憶體地址。
我們都知道在這裡this就是代表了當前物件,當this關鍵字和字串連線的時候,也會轉換成該物件的地址,會呼叫toString()方法,而這個this原本就在toString()方法中,會造成什麼後果呢?就是永遠地在遞迴呼叫,直到堆疊溢位。下面看執行上述程式碼所報的異常。
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
……
那麼我們想要檢視InfiniteRecursion類的地址應該怎麼做呢?可以通過呼叫其父類的toString()方法來實現,雖然InfiniteRecursion這個類沒有明確的繼承某個類,但是我們知道所有的類都是預設繼承Object類的。
import java.util.ArrayList;
import java.util.List;
/**
* Created by msc on 2017/1/8.
*/
public class InfiniteRecursion {
@Override
public String toString() {
return "InfiniteRecursion address: "+super.toString()+"\n";
}
public static void main(String[] args) {
List<InfiniteRecursion> v=new ArrayList<InfiniteRecursion>();
for (int i=0;i<10;i++){
v.add(new InfiniteRecursion());
}
System.out.println(v);
}
}
看執行結果:
[InfiniteRecursion address: InfiniteRecursion@4554617c
, InfiniteRecursion address: InfiniteRecursion@74a14482
, InfiniteRecursion address: InfiniteRecursion@1540e19d
, InfiniteRecursion address: InfiniteRecursion@677327b6
, InfiniteRecursion address: InfiniteRecursion@14ae5a5
, InfiniteRecursion address: InfiniteRecursion@7f31245a
, InfiniteRecursion address: InfiniteRecursion@6d6f6e28
, InfiniteRecursion address: InfiniteRecursion@135fbaa4
, InfiniteRecursion address: InfiniteRecursion@45ee12a7
, InfiniteRecursion address: InfiniteRecursion@330bedb4
]
相關文章
- ThinkPHP 無限遞迴PHP遞迴
- ThinkPHP 無線遞迴分類PHP遞迴
- 無限遞迴導致StackOverflowError遞迴Error
- sql無限遞迴查詢SQL遞迴
- 10-17 c遞迴與遞推初識遞迴
- 遞迴和尾遞迴遞迴
- PHP無限遞迴選單的實現流程PHP遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 『無為則無心』Python函式 — 32、遞迴Python函式遞迴
- 逐步學習什麼是遞迴?通過使用場景來深入認識遞迴。遞迴
- 遞迴遞迴
- ACM(遞迴遞推—A)ACM遞迴
- php 無限分類遞迴 和 無限分類引入 的效能差距PHP遞迴
- PHP無限級分類的實現(不使用遞迴)PHP遞迴
- 徹底理解遞迴,從遞迴的本質說起!遞迴
- 函式的遞迴函式遞迴
- JavaScript中的遞迴JavaScript遞迴
- 神坑·Python 裝飾類無限遞迴Python遞迴
- Ztree + PHP 無限級節點遞迴查詢PHP遞迴
- ACM(遞迴遞推—I)ACM遞迴
- JavaScript遞迴JavaScript遞迴
- go 遞迴Go遞迴
- 理解遞迴遞迴
- 遞迴 Java遞迴Java
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- 最難的不是遞迴,是這場面試的有緣無分遞迴面試
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 類化意識:8階迴文數同心幻方
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- oracle中的遞迴sql查詢 connect by prior實現遞迴Oracle遞迴SQL
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 遞迴函式的理解遞迴函式
- SQL中的遞迴用法SQL遞迴
- Vue中元件的遞迴Vue元件遞迴