首頁  >  文章  >  Java  >  Array和ArrayList的差異與聯繫

Array和ArrayList的差異與聯繫

巴扎黑
巴扎黑原創
2017-06-26 10:22:592264瀏覽

  部落客今天去了一個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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn