引用回收時機

由下面一段代碼引起的思考:java

// 注:提取出list中的人員 3個一組
if (baList != null && baList.size() > 0) {
	EntMajorPerson emp = new EntMajorPerson();  ☆         
	for (int i = 0; i < (baList.size() / 3);) {
		// EntMajorPerson emp = new EntMajorPerson();
		Integer num = Integer.valueOf(baList.get(i));
		emp.setSerialNumber(num);
		emp.setFullName(baList.get(i + 1));
		emp.setPost(baList.get(i + 2));
		emp.setRegisterLinkId(registerLinkId);
		emp.setCreateTime(getCreateTime());
		entMajorPersons.add(emp);
		i += 3;
	}
	if (entMajorPersons.size() != 0) {
		DataManager.addDatas(DataManager.EntMajorPersonMapper_Key, entMajorPersons);
	}
}

 

上文中打重點符號的這句話若是在for循環的外部試想會有什麼後果?
直接現象就是,每回存儲用的都是一個對象,後一個對象的屬性若是爲空值,那麼前一個的屬性就覆蓋過來了,會發生錯誤。
解決辦法就是將建立對象這句話放到循環裏面,每次都建立一個新的對象。
但細想一步,每次都建立一個對象,會不會下降效率,消耗更多內存呢?程序員

☆答案是否認的
引用以前的TIJ中的內存分析的一段:app

2. 棧(又名堆棧),原型就是碟盤子模型,先放的盤子後拿。棧位於通用RAM(隨機訪問存儲器)中,但經過堆棧指針能夠直接從處理器那裏得到直接支持。經過棧頂指針的上下移動來建立和釋放內存,這是一種快速有效的分配存儲的方法,僅次於寄存器。可是這種方式,java系統必須知道存儲在堆棧內全部項的生命週期,以便上下移動堆棧指針。因此對象的引用存在與堆棧中(由於有確切的生命週期),可是對象不會存於堆棧中(無確切的生命週期)。
3.堆。一種通用的內存池,也是位於RAM區,用於存放全部的java對象。堆不一樣與堆棧的好處是:編譯器不須要知道存儲的數據在堆裏存活多長時間。所以,在堆裏分配存儲由很大的靈活性。當須要一個對象時,只需new一個,當執行時,會自動在堆裏進行分配內存。固然,爲了這種靈活性必須付出相應的代價:用堆進行存儲分配和清理可能比用堆棧進行存儲分配須要更多的時間。(對比於C++,對象會在棧中存儲,由於對象的生命週期都是程序員本身控制的)指針

引用是存在棧中的,由於有確切的生命週期,棧指針的移動是很是快的,到生命週期結束內存就釋放了。
因此回到上面的話題,這句話在循環內部是能夠的。code

相關文章
相關標籤/搜索