章節七、1-ArrayList
阿新 • • 發佈:2018-12-10
一、集合是一個容器,前面講的數值也是一個容器,
它們的區別是:
1、陣列既可以儲存基本資料型別,又可以儲存引用資料型別,而集合只能儲存引用資料型別,也就是物件。
2、基本資料型別儲存的是值,引用資料型別儲存的是地址值。
3、陣列的長度是固定不變的,集合的長度可以根據元素的增加而增加。
二、向List集合中新增元素
package introduction9; import java.util.ArrayList; /*** * 單列集合有Collection * Collection集合常用子介面有List 和 Set * Collection是層次結構中的根介面 * List和Set是子介面,List以及他的實現類特點是可存重複的元素,Set以及他的實現類特點是不可有重複元素 * List介面的實現類最常用的有Arraylist,特點是可重複元素 * Set介面實現類最常用的有HashSet TreeSet 特點是不可有重複元素 * * 雙列集合有MAP,雙列指的是鍵值對的形式儲存 * MAP也是介面,java裡面實現好的類有HashMap*/ public class ArrayListDemo { public static void main(String[] args) { /** ArrayList<String>表示在這個集合中儲存的元素型別為String型別, 因為java是強型別的,所以使用前要宣告使用型別, 新建的集合元素預設大小為10, 如果在ArrayList<String>()不輸入內容,代表的是呼叫空引數,預設值為10 如果在括號中帶上引數,ArrayList<String>(100)輸入100表示集合的初始值大小為100, 指定大小的好處是可以節省資源, List物件實際上是儲存在一個引用型陣列中,表面上看該陣列能夠自動增長改變大小, 實際上這個陣列並沒有辦法改變大小,它只是改變了引用型陣列的指向而已, java自動增加ArrayList陣列的意思是指向ArrayList裡新增物件時,原物件的數目加一, 如果大於原底層陣列的長度,就以適當的元素新建一個原數值的拷貝,並修改原數值(指向新建的陣列), 原陣列自動拋棄,java中有垃圾回收機制,會自動回收這些垃圾,當即使這樣有時候還是會比較耗資源, 在使用者向ArrayList裡面追加物件時,java總是要計算容量是否適當,如果容量不足時就把原陣列拷貝 新陣列內,對原陣列變數重新賦值指向新陣列*/ //建立一個ArrayList物件 ArrayList<String> cars = new ArrayList<String>(); //如何向集合中增加元素? //新增元素到名為cars的ArrayList中 cars.add("BMW"); cars.add("Honda"); cars.add("Audi"); } }
三、獲取元素個數 size方法
package introduction9; import java.util.ArrayList;/*** * 單列集合有Collection * Collection集合常用子介面有List 和 Set * Collection是層次結構中的根介面 * List和Set是子介面,List以及他的實現類特點是可存重複的元素,Set以及他的實現類特點是不可有重複元素 * List介面的實現類最常用的有Arraylist,特點是可重複元素 * Set介面實現類最常用的有HashSet TreeSet 特點是不可有重複元素 * * 雙列集合有MAP,雙列指的是鍵值對的形式儲存 * MAP也是介面,java裡面實現好的類有HashMap */ public class ArrayListDemo { public static void main(String[] args) { /** ArrayList<String>表示在這個集合中儲存的元素型別為String型別, 因為java是強型別的,所以使用前要宣告使用型別, 新建的集合元素預設大小為10, 如果在ArrayList<String>()不輸入內容,代表的是呼叫空引數,預設值為10 如果在括號中帶上引數,ArrayList<String>(100)輸入100表示集合的初始值大小為100, 指定大小的好處是可以節省資源, List物件實際上是儲存在一個引用型陣列中,表面上看該陣列能夠自動增長改變大小, 實際上這個陣列並沒有辦法改變大小,它只是改變了引用型陣列的指向而已, java自動增加ArrayList陣列的意思是指向ArrayList裡新增物件時,原物件的數目加一, 如果大於原底層陣列的長度,就以適當的元素新建一個原數值的拷貝,並修改原數值(指向新建的陣列), 原陣列自動拋棄,java中有垃圾回收機制,會自動回收這些垃圾,當即使這樣有時候還是會比較耗資源, 在使用者向ArrayList裡面追加物件時,java總是要計算容量是否適當,如果容量不足時就把原陣列拷貝 新陣列內,對原陣列變數重新賦值指向新陣列 */ //建立一個ArrayList物件 ArrayList<String> cars = new ArrayList<String>(); //如何向集合中增加元素? //新增元素到名為cars的ArrayList中 cars.add("BMW"); cars.add("Honda"); cars.add("Audi"); //大小 size獲取集合中的元素集合的歌數 int size = cars.size(); System.out.println("這個list集合的大小為:"+size); } }
執行結果:
四、通過索引訪問集合中的元素(索引位從0開始)
package introduction9; import java.util.ArrayList; /*** * 單列集合有Collection * Collection集合常用子介面有List 和 Set * Collection是層次結構中的根介面 * List和Set是子介面,List以及他的實現類特點是可存重複的元素,Set以及他的實現類特點是不可有重複元素 * List介面的實現類最常用的有Arraylist,特點是可重複元素 * Set介面實現類最常用的有HashSet TreeSet 特點是不可有重複元素 * * 雙列集合有MAP,雙列指的是鍵值對的形式儲存 * MAP也是介面,java裡面實現好的類有HashMap */ public class ArrayListDemo { public static void main(String[] args) { /** ArrayList<String>表示在這個集合中儲存的元素型別為String型別, 因為java是強型別的,所以使用前要宣告使用型別, 新建的集合元素預設大小為10, 如果在ArrayList<String>()不輸入內容,代表的是呼叫空引數,預設值為10 如果在括號中帶上引數,ArrayList<String>(100)輸入100表示集合的初始值大小為100, 指定大小的好處是可以節省資源, List物件實際上是儲存在一個引用型陣列中,表面上看該陣列能夠自動增長改變大小, 實際上這個陣列並沒有辦法改變大小,它只是改變了引用型陣列的指向而已, java自動增加ArrayList陣列的意思是指向ArrayList裡新增物件時,原物件的數目加一, 如果大於原底層陣列的長度,就以適當的元素新建一個原數值的拷貝,並修改原數值(指向新建的陣列), 原陣列自動拋棄,java中有垃圾回收機制,會自動回收這些垃圾,當即使這樣有時候還是會比較耗資源, 在使用者向ArrayList裡面追加物件時,java總是要計算容量是否適當,如果容量不足時就把原陣列拷貝 新陣列內,對原陣列變數重新賦值指向新陣列 */ //建立一個ArrayList物件 ArrayList<String> cars = new ArrayList<String>(); //如何向集合中增加元素? //新增元素到名為cars的ArrayList中 cars.add("BMW"); cars.add("Honda"); cars.add("Audi"); //大小 size獲取集合中的元素集合的歌數 int size = cars.size(); System.out.println("這個list集合的大小為:"+size); //通過索引訪問集合中的元素 System.out.println("1索引位上的元素為:"+cars.get(1)); } }
執行結果為:
五、遍歷集合元素
package introduction9; import java.util.ArrayList; /*** * 單列集合有Collection * Collection集合常用子介面有List 和 Set * Collection是層次結構中的根介面 * List和Set是子介面,List以及他的實現類特點是可存重複的元素,Set以及他的實現類特點是不可有重複元素 * List介面的實現類最常用的有Arraylist,特點是可重複元素 * Set介面實現類最常用的有HashSet TreeSet 特點是不可有重複元素 * * 雙列集合有MAP,雙列指的是鍵值對的形式儲存 * MAP也是介面,java裡面實現好的類有HashMap */ public class ArrayListDemo { public static void main(String[] args) { /** ArrayList<String>表示在這個集合中儲存的元素型別為String型別, 因為java是強型別的,所以使用前要宣告使用型別, 新建的集合元素預設大小為10, 如果在ArrayList<String>()不輸入內容,代表的是呼叫空引數,預設值為10 如果在括號中帶上引數,ArrayList<String>(100)輸入100表示集合的初始值大小為100, 指定大小的好處是可以節省資源, List物件實際上是儲存在一個引用型陣列中,表面上看該陣列能夠自動增長改變大小, 實際上這個陣列並沒有辦法改變大小,它只是改變了引用型陣列的指向而已, java自動增加ArrayList陣列的意思是指向ArrayList裡新增物件時,原物件的數目加一, 如果大於原底層陣列的長度,就以適當的元素新建一個原數值的拷貝,並修改原數值(指向新建的陣列), 原陣列自動拋棄,java中有垃圾回收機制,會自動回收這些垃圾,當即使這樣有時候還是會比較耗資源, 在使用者向ArrayList裡面追加物件時,java總是要計算容量是否適當,如果容量不足時就把原陣列拷貝 新陣列內,對原陣列變數重新賦值指向新陣列 */ //建立一個ArrayList物件 ArrayList<String> cars = new ArrayList<String>(); //如何向集合中增加元素? //新增元素到名為cars的ArrayList中 cars.add("BMW"); cars.add("Honda"); cars.add("Audi"); //大小 size獲取集合中的元素集合的歌數 int size = cars.size(); System.out.println("這個list集合的大小為:"+size); //通過索引訪問集合中的元素 System.out.println("1索引位上的元素為:"+cars.get(1)); //遍歷集合元素 //方式一: System.out.println("遍歷集合"); for(int i = 0;i<size;i++) { System.out.println("索引位"+i+"上的元素為:"+cars.get(i)); } //方式二:使用高階for迴圈 System.out.println("\n高階for迴圈"); for(String car:cars) { System.out.println("集合元素為:"+car); } } }
執行結果為:
六、移除元素
package introduction9; import java.util.ArrayList; /*** * 單列集合有Collection * Collection集合常用子介面有List 和 Set * Collection是層次結構中的根介面 * List和Set是子介面,List以及他的實現類特點是可存重複的元素,Set以及他的實現類特點是不可有重複元素 * List介面的實現類最常用的有Arraylist,特點是可重複元素 * Set介面實現類最常用的有HashSet TreeSet 特點是不可有重複元素 * * 雙列集合有MAP,雙列指的是鍵值對的形式儲存 * MAP也是介面,java裡面實現好的類有HashMap */ public class ArrayListDemo { public static void main(String[] args) { /** ArrayList<String>表示在這個集合中儲存的元素型別為String型別, 因為java是強型別的,所以使用前要宣告使用型別, 新建的集合元素預設大小為10, 如果在ArrayList<String>()不輸入內容,代表的是呼叫空引數,預設值為10 如果在括號中帶上引數,ArrayList<String>(100)輸入100表示集合的初始值大小為100, 指定大小的好處是可以節省資源, List物件實際上是儲存在一個引用型陣列中,表面上看該陣列能夠自動增長改變大小, 實際上這個陣列並沒有辦法改變大小,它只是改變了引用型陣列的指向而已, java自動增加ArrayList陣列的意思是指向ArrayList裡新增物件時,原物件的數目加一, 如果大於原底層陣列的長度,就以適當的元素新建一個原數值的拷貝,並修改原數值(指向新建的陣列), 原陣列自動拋棄,java中有垃圾回收機制,會自動回收這些垃圾,當即使這樣有時候還是會比較耗資源, 在使用者向ArrayList裡面追加物件時,java總是要計算容量是否適當,如果容量不足時就把原陣列拷貝 新陣列內,對原陣列變數重新賦值指向新陣列 */ //建立一個ArrayList物件 ArrayList<String> cars = new ArrayList<String>(); //如何向集合中增加元素? //新增元素到名為cars的ArrayList中 cars.add("BMW"); cars.add("Honda"); cars.add("Audi"); //大小 size獲取集合中的元素集合的歌數 int size = cars.size(); System.out.println("這個list集合的大小為:"+size); //通過索引訪問集合中的元素 System.out.println("1索引位上的元素為:"+cars.get(1)); //遍歷集合元素 //方式一: System.out.println("遍歷集合"); for(int i = 0;i<size;i++) { System.out.println("索引位"+i+"上的元素為:"+cars.get(i)); } //方式二:使用高階for迴圈 System.out.println("\n高階for迴圈"); for(String car:cars) { System.out.println("集合元素為:"+car); } //移除集合元素(移除最後一個元素) cars.remove(size-1); System.out.println("\n高階for迴圈移除元素之後"); for(String car:cars) { System.out.println("集合元素為:"+car); } } }
執行結果為:
七、此演示中移除元素比較快,因為集合中只有三位,當如果如果集合中元素較多,例如有2000個,移除倒數一、二、三位上的元素效率與集合只有三位的的效率一樣,刪除後元素後這個元素的索引位就會空下來,而ArrayList增刪時會帶來元素的移動,如果在中間刪除一個元素,後面所有位置上的元素都會向前面移動,增加資料會向後移動,因此當如果想要移除前面一、二、三個元素的話,這樣會影響效率,所以增刪元素時用linked List集合會比較快(下一節中會講到),這也是ArrayList和Linked List的不同之處。
八、查詢用ArrayList會比較快,因為ArrayList底層是陣列實現的,使用下標查詢,不需要比較,基於位置來讀取相應的位元組數。