關於棧內存溢出的一個問題

這兩天在學習java泛型(博主參考的是瘋狂java講義,真的是一本不錯的java學習參考書哦)的時候無意中看到一個棧內存溢出的例子,先將自己的學習筆記寫下來,希望剛入門的朋友能有所收貨,高手請主動跳過。

class StrList
{
	private List strList = new ArrayList();
	public boolean add(String ele)
	{
		return strList.add(ele);//1:return add(ele);
	}
	// 重寫get方法,將get方法的返回值類型改爲String類型
	public String get(int index)
	{
		return (String)strList.get(index);//2:return get(index);
	}
	public int size()
	{
		return strList.size();//3:return size();
	}
}
public class CheckType
{
	public static void main(String[] args) 
	{
		// 創建一個只想保存字符串的List集合
		StrList strList = new StrList();
		strList.add("瘋狂Java講義");
		strList.add("瘋狂Android講義");
		strList.add("輕量級Java EE企業應用實戰");
		// 下面語句不能把Integer對象“丟進”集合中,將引起編譯錯誤
		//strList.add(5);     // ①
		System.out.println(strList);
		for (int i = 0; i < strList.size() ; i++ )
		{
			// 因爲StrList裏元素的類型就是String類型,
			// 所以無須強制類型轉換
			String str = strList.get(i);
		}
	}
}

可以發現,當改成代碼中1,2,3處的任意一處的語句的時候,編譯不會出錯,但是運行時會提示Exception in thread "main" java.lang.StackOverflowError說明發生了棧內存溢出問題。通過自己查閱資料跟經驗發現,不加strList以限制內存大小當然會導致內存溢出,這個問題想必大部分編程愛好者都能理解,博主在這有點多此一舉了大笑,既然到了河邊哪有不溼鞋,那就再來一波毒奶:這些代碼其實本意是想判斷①處的類型是否在編譯的時候能檢查出來,這樣做當然是可以的,但是代碼太過龐大,所以如果改成泛型就更好了,更多資料可以參考李陽的瘋狂Java講義哦!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章