部落客今天去了一個java的實習面試,發現有好多java最基礎的資料結構對於部落客來說反而感到陌生,在面試官問一些常見的例如HashMap這樣的資料結構,部落客能回答的頭目是道,但問到Array和ArrayList的差別和連結之後,卻讓部落客一臉懵。好吧,不多說,現在特此整理。
首先, Array是java中的數組,我們宣告java的陣列有三種方式:
1 int[] a = new int[10]; 2 int a[] = new int[10]; //这种方式同c语言一样3 int a[] = {1,2,3,4};
從上面的宣告可以看出來,我們在定義了一個數組的時候,必須指定這個數組的資料類型,也就是說,數組是相同資料類型的集合。另外,在陣列宣告的時候,我們也宣告了陣列的大小,陣列的元素個數是固定的。
下面,我們來看看陣列的應用:
1 import java.util.Arrays; 2 3 /** 4 * @author jy 5 * @time 下午7:59:26 6 */ 7 public class ArrayAndArrayList { 8 public static void main(String[] args) { 9 10 int a[] = new int[4];11 System.out.println(a.length); //数组的长度属性12 13 int b[] = {1,2};14 int c[] = {1,2};15 System.out.println(b.equals(c)); //输出为false,可见数组并没有重写hashcode()和equals()方法16 System.out.println(Arrays.equals(b, c)); //利用java.util.Array的equals()来判断数组是否相等,这里输出true17 System.out.println(isEquals(b,c));18 19 }20 21 /**22 * 重写方法来手动实现数组之间的比较方法23 */24 public static boolean isEquals(int[] b, int[] c) {25 26 if(b == null || c == null){27 return false;28 }29 if(b.length != c.length){30 return false;31 }32 for (int i = 0; i < c.length; i ++) {33 if(b[i] != c[i]){34 return false;35 }36 }37 return true;38 }39 40 }
#可見,陣列的長度是固定的,不可變的。數組並未重寫object的hashcCode()和equals()方法。
我們都知道,陣列還可以是二維的,下面我們看看二維陣列是如何宣告的:
1 int[][] da = new int[2][3]; //推荐用这种声明方式,更能表明数组的类型2 int db[][] = new int[4][3];
但是,有一種變長的二維數組:
1 int[][] dc = new int[2][]; //第一维的大小不能空缺,第二维的大小可以是不一样的。2 dc[0] = new int[2];3 dc[1] = new int[3];
好了,數組這個基本的資料結構的應用我們就說到這裡,為了突出主題,其餘的一些不相干的應用我們就不扯了。
下面,我們再來看看ArrayList這個集合:
ArrayList是動態數組,也就是數組的複雜版本,它可以動態的新增和刪除元素,ArrayList實作了java.util.Collections.Collection.List介面。下面我們來看最基本的宣告:
ArrayList list = new ArrayList(10); ArrayList<Integer> list1 = new ArrayList<Integer>();
第一種宣告中,在不使用泛型的情況下,這個list是可以加入不同類型的元素的,而且arraylist是可以不用指定長度的。在使用泛型時,我們就只能新增一種類型的資料了。
ArrayList的重要方法和屬性如下程式碼所示:
ArrayList<Integer> list = ArrayList<Integer> list.add(1 list.add(2 list.add(3 list.remove(1 Object[] p = list.toArray(); System.out.println(p[0 System.out.println(list.contains(4)); System.out.println(list.size()); System.out.println(list.get(0));
上面顯示了ArrayList的一些重要的方法。以下我們將這兩個集合類別進行比較:
(1)ArrayList是Array的複雜版本
ArrayList內部封裝了一個Object類型的陣列,從一般的意義來說,它和陣列沒有本質的差別,甚至於ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內部陣列的基礎上直接呼叫Array的對應方法。
(2)儲存的資料型別
ArrayList可以儲存異質對象,而Array則只能儲存相同資料類型的資料。
(3)長度的變化
Array的長度實際上是不可變的,二維變長數組實際上的長度也是固定的,而可變的只是其中元素的長度。而ArrayList的長度既可以指定(即使指定了長度,也會自動2倍擴容)也可以不指定,是變長的。
(4)存取與增刪元素
對一般的引用型別來說,這部分的效果不是很大,但是對於價值型別來說,往ArrayList裡面新增與修改元素,都會引起裝箱和拆箱的操作,頻繁的操作可能會影響一部分效率。另外,ArrayList是動態數組,它不包括透過Key或Value快速存取的演算法,所以實際上呼叫IndexOf、Contains等方法是執行的簡單的循環來尋找元素,所以頻繁的呼叫此類方法並不比你自己寫循環並且稍作優化來的快,如果有這方面的要求,建議使用Hashtable或SortedList等鍵值對的集合。
好了,關於這兩個資料結構的比較我們就到這裡,如果有覺得不妥的地方,歡迎大家指正。
另外,這是我第一次寫博客,求輕噴。
以上是Array和ArrayList的差異與聯繫的詳細內容。更多資訊請關注PHP中文網其他相關文章!