標籤:進一步 for 個數 [] min 例子 資料結構 set get
一、Java_Collections表的實現
與c不同Java已經實現並封裝了現成的表資料結構,順序表以及鏈表。
1、ArrayList是基於數組的實現,因此具有的特點是:1.有索引值方便尋找,對於get和set操作花費常數時間,2.但是其缺點是:插入/刪除某個資料的代價比較大。
2、LinkedList是基於雙鏈表實現,因此具有的特點是:1.基於鏈表方便插入與刪除操作開銷較小,2.但是不方便索引,不管是索引哪一個元素都需要從頭開始逐次尋找。
就增刪操作下面舉個簡單例子:給出一個表(具體實現未知),將該表中偶數值的項刪除,比如該表中的元素為:1,2,3,4,5,調用該方法後得到元素:1,3,5
//-----------------------------------------------------------
//該代碼主要是用來說明順序表與鏈表在增刪上的操作消耗
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.LinkedList; 4 import java.util.List; 5 import java.util.ListIterator; 6 7 /** 8 * 找到一個表list中偶數值的項,並刪除 下面顯示逐漸最佳化的過程 對比順序表:arrayList與LinkedList。自己把握 9 * 10 * @author Administrator11 * 12 */13 public class RemoveEvens {14 public static void main(String[] args) {15 List<Integer> list = new ArrayList<>();16 list.add(1);17 list.add(2);18 list.add(3);19 list.add(4);20 21 // removeEvensVer2(list);22 23 for (int i : list) {24 System.out.println(i);25 }26 }27 28 // 基礎版本29 /*30 * 對於ArrayList集合,get方法雖然較快,但是remove的時間消耗為二次時間,31 * 對於linkedlist集合,暴露兩個問題首先是對get的調用效率不是很高因此常式花費二次時間,而且同時對remove32 * 的調用同樣低效,因為要到達i的代價是昂貴的。33 */34 public static void removeEvensVer1(List<Integer> list) {35 36 int i = 0;37 // 遍曆列表,獲得每一個元素38 while (i < list.size()) {39 // 當前項是偶數,就移除40 if (list.get(i) % 2 == 0) {41 list.remove(i);42 } else {43 i++;44 }45 }46 }47 48 // 迭代器版本增強版本,避免並發修改異常49 // 對於linkedlist的迭代器的remove方法只消耗常數時間項,該方法對於arraylist仍是無可救藥50 51 public static void removeEvensVer2(List<Integer> list) {52 Iterator<Integer> iterator = list.iterator();53 while (iterator.hasNext()) {54 if (iterator.next() % 2 == 0) {55 iterator.remove();56 }57 }58 }59 60 // 並發修改異常,一般這裡會出現,主要是由於迭代器的引用失效61 public static void removeEvensVer3(List<Integer> list) {62 // ListIterator<Integer> listIterator = list.listIterator();63 //增強for本質上是使用迭代器實現,而list的remove方法導致list發生變化,進一步導致原list的迭代器引用64 //發生變化,導致並發異常。65 for (Integer x : list) {66 if (x % 2 == 0) {67 list.remove(x);68 }69 }70 }71 }
Java資料結構之表的增刪對比---ArrayList與LinkedList之一