進口?Java . util . ArrayList;
進口?Java . util . iterator;
進口?Java . util . list;
公共?班級?主要?{
公共?靜電?作廢?main(String[]?args)?{
列表& lt整數& gt?列表?=?新的?ArrayList & lt& gt();
為了什麽?(int?我?=?0;?我?& lt?10;?i++)?{
list . add(I);
}
//用於循環遍歷
為了什麽?(int?我?=?0,?尺寸?=?list . size();?我?& lt?尺寸;?i++)?{
system . out . println(list . get(I));
}
//叠代器叠代器遍歷
叠代器& lt整數& gt?它?=?list . iterator();
什麽時候?(it.hasNext())?{
system . out . println(it . next());
}
//foreach循環
為了什麽?(整數?我?:?列表)?{
system . out . println(I);
}
}
數據元素是如何存儲在內存中的?
有兩種主要的存儲方法:
1,順序存儲,隨機存取(直接存取):
這樣,相鄰的數據元素存儲在相鄰的內存地址中,整個內存地址是連續的。可以根據元素的位置直接計算內存地址,直接讀取。讀取特定位置元素的平均時間復雜度為O(1)。通常,只有基於數組實現的集合才具有此功能。數組列表是用Java表示的。
2、鏈式存儲,順序存取:
這樣,每個數據元素不需要在內存中的相鄰位置,並且每個數據元素包含其下壹個元素的內存地址。不能根據元素的位置直接計算內存地址,只能按順序讀取元素。讀取特定位置的元素的平均時間復雜度是O(n)。主要用鏈表來表示。LinkedList用Java表示。
每種遍歷方法的實現原理是什麽?
1,傳統用於循環遍歷,基於計數器:
walker在集合外維護壹個計數器,然後依次讀取每個位置的元素,讀到最後壹個元素時停止。主要是按照元素的位置來讀元素。
2、叠代器遍歷,叠代器:
壹般來說,每個特定的數據集都需要提供相應的叠代器。與傳統的for循環相比,叠代器禁止了顯式遍歷計數器。所以基於順序存儲集的叠代器可以通過位置直接訪問數據。基於鏈式存儲集的叠代器的正常實現需要保存當前遍歷位置。然後根據當前位置向前或向後移動指針。
3.foreach循環遍歷:
根據反編譯的字節碼,我們可以發現foreach也是以叠代器的方式實現的,但是Java編譯器幫助我們生成了這些代碼。
遍歷模式在哪裏適用?
1,傳統用於循環遍歷,基於計數器:
順序存儲:讀取性能比較高。適用於遍歷順序存儲集。
鏈式存儲:遍歷鏈式存儲集的時間復雜度太大。
2、叠代器遍歷,叠代器:
順序存儲:如果不太在意時間,建議選擇這種方式。畢竟代碼更簡潔,也防止了脫單的問題。
鏈式存儲:意義重大,平均時間復雜度降為O(n),相當吸引人,推薦這種遍歷方式。
3.foreach循環遍歷:
Foreach只是讓代碼更簡潔,但是有壹些缺點,就是不能操作數據集(刪除等。)在遍歷期間,所以在某些場合不使用。而且是基於叠代器本身,但是由於類型轉換的問題,會比直接用叠代器慢壹點,不過還好時間復雜度是壹樣的。那麽如何選擇,參考以上兩種方式,做壹個折中的選擇。