編寫高質量程式碼:改善Java程式的151個建議(第5章:陣列和集合___建議70~74)
阿新 • • 發佈:2019-07-18
本節內容有些吹毛求疵、晦澀難懂!
建議70:子列表只是原列表的一個檢視
List介面提供了subList方法,其作用是返回一個列表的子列表,這與String類subSting有點類似。
注意:subList產生的列表只是一個檢視,所有的修改動作直接作用於原列表。
建議71:推薦使用subList處理區域性列表
我們來看這樣一個簡單的需求:一個列表有100個元素,現在要刪除索引位置為20~30的元素。這很簡單,一個遍歷很快就可以完成,程式碼如下:
public class Client71 { public static void main(String[] args) { // 初始化一個固定長度,不可變列表 List<Integer> initData = Collections.nCopies(100, 0); // 轉換為可變列表 List<Integer> list = new ArrayList<Integer>(initData); // 遍歷,刪除符合條件的元素 for (int i = 0; i < list.size(); i++) { if (i >= 20 && i < 30) { list.remove(i); } } } }
這段程式碼很符合我的風格!
下面用subList解決這個問題:
public static void main(String[] args) { // 初始化一個固定長度,不可變列表 List<Integer> initData = Collections.nCopies(100, 0); // 轉換為可變列表 List<Integer> list = new ArrayList<Integer>(initData); //刪除指定範圍內的元素 list.subList(20, 30).clear(); }
建議72:生成子列表後不要再操作原列表
注意:subList生成子列表後,保持原列表的只讀狀態。
建議73:使用Comparator進行排序
1、預設排序
Collections.sort(list)
2、按某欄位排序
Collections.sort(list,new PositionComparator())
知道這些就行了,原文寫的太晦澀了,我感覺沒啥用!
想了解更多的使用Comparator進行排序
建議74:不推薦使用binarySearch對列表進行檢索
不推薦,乾脆就不要寫了,好嗎?
對列表進行檢索就使用indexOf就挺好的!
public class Client74 { public static void main(String[] args) { List<String> cities = new ArrayList<String> (); cities.add("上海"); cities.add("廣州"); cities.add("廣州"); cities.add("北京"); cities.add("天津"); //indexOf取得索引值 int index1= cities.indexOf("廣州"); //binarySearch找到索引值 int index2= Collections.binarySearch(cities, "廣州"); System.out.println("索引值(indexOf):"+index1); System.out.println("索引值(binarySearch):"+index2); } }
binarySearch採用的是二分法搜尋的Java版實現。從中間開始搜尋,結果肯定是2了。
使用binarySearch的二分法查詢比indexOf的遍歷演算法效能上高很多,特別是在大資料集且目標值又接近尾部時,binarySearch方法與indexOf方法相比,效能上會提升幾十倍,因此從效能的角度考慮時可以選擇binarySearch。
江疏影讀書系列之編寫高質量程式碼:改善Java程式的151個建議@目錄