詳談Array和ArrayList的區(qū)別與聯(lián)系
昨天去了一個(gè)java的實(shí)習(xí)面試,發(fā)現(xiàn)有好多java最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)對于博主來說反而感到陌生,在面試官問一些常見的例如HashMap這樣的數(shù)據(jù)結(jié)構(gòu),博主能回答的頭頭是道,但是在問到Array和ArrayList的區(qū)別和聯(lián)系之后,卻讓博主一臉懵。好吧,不多說,現(xiàn)在特此整理。
首先, Array是java中的數(shù)組,我們聲明java的數(shù)組有三種方式:
int[] a = new int[10]; int a[] = new int[10]; //這種方式同c語言一樣 int a[] = {1,2,3,4};
從上面的聲明中可以看出來,我們在定義了一個(gè)數(shù)組的時(shí)候,必須指定這個(gè)數(shù)組的數(shù)據(jù)類型,也就是說,數(shù)組是相同數(shù)據(jù)類型的集合。另外,在數(shù)組聲明的時(shí)候,我們也聲明了數(shù)組的大小,數(shù)組的元素個(gè)數(shù)是固定的。
下面,我們看看數(shù)組的應(yīng)用:
import java.util.Arrays; /** * @author jy * @time 下午7:59:26 */ public class ArrayAndArrayList { public static void main(String[] args) { int a[] = new int[4]; System.out.println(a.length); //數(shù)組的長度屬性 int b[] = {1,2}; int c[] = {1,2}; System.out.println(b.equals(c)); //輸出為false,可見數(shù)組并沒有重寫hashcode()和equals()方法 System.out.println(Arrays.equals(b, c)); //利用java.util.Array的equals()來判斷數(shù)組是否相等,這里輸出true System.out.println(isEquals(b,c)); } /** * 重寫方法來手動(dòng)實(shí)現(xiàn)數(shù)組之間的比較方法 */ public static boolean isEquals(int[] b, int[] c) { if(b.length != c.length){ return false; } if(b == null ||c == null){ return false; } for (int i = 0; i < c.length; i ++) { if(b[i] != c[i]){ return false; } } return true; } }
可見,數(shù)組的長度是固定的,不可變的。數(shù)組并未重寫object的hashcCode()和equals()方法。
我們都知道,數(shù)組還可以是二維的,下面我們看看二維數(shù)組是如何聲明的:
int[][] da = new int[2][3]; //推薦用這種聲明方式,更能表明數(shù)組的類型 int db[][] = new int[4][3];
但是,有一種變長的二維數(shù)組:
int[][] dc = new int[2][]; //第一維的大小不能空缺,第二維的大小可以是不一樣的。 dc[0] = new int[2]; dc[1] = new int[3];
好了,數(shù)組這個(gè)基本的數(shù)據(jù)結(jié)構(gòu)的應(yīng)用我們就說到這里,為了突出主題,其余的一些不相干的應(yīng)用我們就不扯了。
下面,我們再來看看ArrayList這個(gè)集合:
ArrayList是動(dòng)態(tài)數(shù)組,也就是數(shù)組的復(fù)雜版本,它可以動(dòng)態(tài)的添加和刪除元素,ArrayList實(shí)現(xiàn)了java.util.Collections.Collection.List接口。下面我們來看一下最基本的聲明:
ArrayList list = new ArrayList(10); ArrayList<Integer> list1 = new ArrayList<Integer>();
第一種聲明中,在不使用泛型的情況下,這個(gè)list是可以添加進(jìn)不同類型的元素的,而且arraylist是可以不用指定長度的。在使用泛型時(shí),我們就只能添加一種類型的數(shù)據(jù)了。
ArrayList的重要方法和屬性如下代碼所示:
ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); list.remove(1); Object[] p = list.toArray(); //轉(zhuǎn)化成數(shù)組 System.out.println(p[0]); System.out.println(list.contains(4)); //是否包含某個(gè)元素 System.out.println(list.size()); //list的長度 System.out.println(list.get(0)); //按位獲取list中的元素 list.trimToSize(); //這個(gè)方法用于將ArrayList固定到實(shí)際元素的大小,當(dāng)動(dòng)態(tài)數(shù)組元素確定不在添加的時(shí)候,可以調(diào)用這個(gè)方法來釋放空余的內(nèi)存
上面顯示了ArrayList的一些重要的方法。下面我們就這兩個(gè)集合類進(jìn)行對比:
(1)ArrayList是Array的復(fù)雜版本
ArrayList內(nèi)部封裝了一個(gè)Object類型的數(shù)組,從一般的意義來說,它和數(shù)組沒有本質(zhì)的差別,甚至于ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內(nèi)部數(shù)組的基礎(chǔ)上直接調(diào)用Array的對應(yīng)方法。
(2)存儲(chǔ)的數(shù)據(jù)類型
ArrayList可以存儲(chǔ)異構(gòu)對象,而Array只能存儲(chǔ)相同數(shù)據(jù)類型的數(shù)據(jù)。
(3)長度的可變
Array的長度實(shí)際上是不可變的,二維變長數(shù)組實(shí)際上的長度也是固定的,可變的只是其中元素的長度。而ArrayList的長度既可以指定(即使指定了長度,也會(huì)自動(dòng)2倍擴(kuò)容)也可以不指定,是變長的。
(4)存取和增刪元素
對于一般的引用類型來說,這部分的影響不是很大,但是對于值類型來說,往ArrayList里面添加和修改元素,都會(huì)引起裝箱和拆箱的操作,頻繁的操作可能會(huì)影響一部分效率。另外,ArrayList是動(dòng)態(tài)數(shù)組,它不包括通過Key或者Value快速訪問的算法,所以實(shí)際上調(diào)用IndexOf、Contains等方法是執(zhí)行的簡單的循環(huán)來查找元素,所以頻繁的調(diào)用此類方法并不比你自己寫循環(huán)并且稍作優(yōu)化來的快,如果有這方面的要求,建議使用Hashtable或SortedList等鍵值對的集合。
好了,關(guān)于這兩個(gè)數(shù)據(jù)結(jié)構(gòu)的對比我們就到這里,如果有覺得不妥的地方,歡迎大家指正。
以上這篇詳談Array和ArrayList的區(qū)別與聯(lián)系就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline 
本文主要介紹了Idea Jrebel 報(bào)錯(cuò):Cannot reactivate,offline seat in use,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06java實(shí)現(xiàn)的順時(shí)針/逆時(shí)針打印矩陣操作示例
這篇文章主要介紹了java實(shí)現(xiàn)的順時(shí)針/逆時(shí)針打印矩陣操作,涉及java基于數(shù)組的矩陣存儲(chǔ)、遍歷、打印輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12解決java -jar XXX.jar沒有主清單屬性以及找不到或無法加載主類的問題
在使用Idea打包SpringBoot項(xiàng)目時(shí),可能會(huì)遇到“沒有主清單屬性”的錯(cuò)誤,問題原因是pom文件中缺少配置,未能正確打包成可執(zhí)行的jar,解決方法包括:1. 修改項(xiàng)目結(jié)構(gòu)并重新生成jar;2. 使用Maven插件在pom文件中添加spring-boot-maven-plugin配置2024-09-09java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Mybatis-Plus 多表聯(lián)查分頁的實(shí)現(xiàn)代碼
本篇文章主要介紹了Mybatis-Plus 多表聯(lián)查分頁的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06SpringBoot使用knife4j進(jìn)行在線接口調(diào)試
這篇文章主要介紹了SpringBoot使用knife4j進(jìn)行在線接口調(diào)試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java基于分治算法實(shí)現(xiàn)的線性時(shí)間選擇操作示例
這篇文章主要介紹了Java基于分治算法實(shí)現(xiàn)的線性時(shí)間選擇操作,涉及java排序、比較、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11SpringBoot實(shí)現(xiàn)excel文件生成和下載
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)excel文件生成和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制
這篇文章主要介紹了關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制,ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,自動(dòng)擴(kuò)容,不是線程安全的,只能用在單線程環(huán)境下,需要的朋友可以參考下2023-05-05