您好,登錄后才能下訂單哦!
ArrayList子類的作用是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
ArrayList是List子接口中使用最多的一個(gè)子類,但是這個(gè)子類在使用時(shí)也是有前提要求的,所以本次來對(duì)這個(gè)類的相關(guān)定義以及源代碼組成進(jìn)行分析,在Java里面ArrayList類的定義如下:
public class ArrayList<E> extends AbstractList<E> mplements List<E>, RandomAccess, Cloneable, Serializable
ArrayList的繼承結(jié)構(gòu)
范例:使用ArrayList實(shí)例化List父接口
import java.util.ArrayList;import java.util.List;public class JavaAPIDemo {public static void main(String[] args) throws Exception { List<String> all = new ArrayList<String>(); //為L(zhǎng)ist父接口進(jìn)行實(shí)例化all.add("Hello");all.add("Hello"); //重復(fù)數(shù)據(jù)all.add("Wolrd");all.add("MLDN");System.out.println(all); //[Hello, Hello, Wolrd, MLDN] } }
通過本程序可以發(fā)現(xiàn)List的存儲(chǔ)特征:
保存的順序就是其存儲(chǔ)的順序;
List集合里面允許存在有重復(fù)數(shù)據(jù);
在以上的程序中雖然實(shí)現(xiàn)了集合的輸出,但是這種輸出的操作是直接利用了每一個(gè)類提供的toString()方法實(shí)現(xiàn)的,為了方便地進(jìn)行輸出處理,在JDK1.8之后Iterable父接口之中定義有一個(gè)forEach()方法,方法定義如下:
輸出支持:default void forEach(Consumer<? super T> action)
范例:利用forEach()方法進(jìn)行輸出(不是標(biāo)準(zhǔn)輸出)
import java.util.ArrayList;import java.util.List;public class JavaAPIDemo {public static void main(String[] args) throws Exception { List<String> all = new ArrayList<String>(); //為L(zhǎng)ist父接口進(jìn)行實(shí)例化all.add("Hello");all.add("Hello"); //重復(fù)數(shù)據(jù)all.add("Wolrd");all.add("MLDN");all.forEach((str) -> {System.out.print(str + "、"); }); //Hello、Hello、Wolrd、MLDN、 } }
需要注意的是,此種輸出并不是正常開發(fā)情況下要考慮的操作形式。
范例:觀察List集合的其它操作方法
import java.util.ArrayList;import java.util.List;public class JavaAPIDemo {public static void main(String[] args) throws Exception { List<String> all = new ArrayList<String>(); //為L(zhǎng)ist父接口進(jìn)行實(shí)例化System.out.println("集合是否為空?">all.isEmpty() + "、集合元素個(gè)數(shù):" + all.size()); //集合是否為空?true、集合元素個(gè)數(shù):0 all.add("Hello");all.add("Hello");//重復(fù)數(shù)據(jù)all.add("Wolrd");all.add("MLDN");all.remove("Hello"); //刪除元素System.out.println("集合是否為空?" + all.isEmpty() + "、集合元素個(gè)數(shù):" + all.size()); //集合是否為空?false、集合元素個(gè)數(shù):3all.forEach((str) -> {System.out.print(str + "、"); }); //Hello、Wolrd、MLDN、 } }
如果以方法的功能為例,那么ArrayList中操作支持與之前編寫的鏈表形式是非常相似的,但是它并不是使用鏈表來實(shí)現(xiàn)的,通過類名稱實(shí)際上就已經(jīng)可以清楚的發(fā)現(xiàn)了,ArrayList應(yīng)該封裝的是一個(gè)數(shù)組。
ArrayList構(gòu)造:public ArrayList()
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
ArrayList構(gòu)造:public ArrayList(int initialCapacity)
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA; } else {throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
通過有參構(gòu)造方法可以發(fā)現(xiàn),在ArrayList中所包含的數(shù)據(jù)實(shí)際上就是一個(gè)對(duì)象數(shù)組。在進(jìn)行數(shù)據(jù)追加時(shí)發(fā)現(xiàn)ArrayList集合中保存的對(duì)象數(shù)組長(zhǎng)度不夠的時(shí)候?qū)?huì)開辟新的數(shù)組,同時(shí)將原始的舊數(shù)組內(nèi)容拷貝到新數(shù)組中。
而后數(shù)組的開辟操作:
private int newCapacity(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity <= 0) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)return Math.max(DEFAULT_CAPACITY, minCapacity);if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return minCapacity; }return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity); }
如果在實(shí)例化ArrayList類對(duì)象時(shí)沒有傳遞初始化的長(zhǎng)度,則默認(rèn)情況下會(huì)使用空數(shù)組,但是如果在進(jìn)行數(shù)據(jù)增加時(shí),發(fā)現(xiàn)數(shù)組容量不夠,則會(huì)判斷當(dāng)前的增長(zhǎng)容量與默認(rèn)的容量的大小,使用較大的一個(gè)數(shù)值進(jìn)行新的數(shù)組開辟,所以可以得出結(jié)論:
JDK1.9之后:ArrayList默認(rèn)的構(gòu)造只會(huì)使用默認(rèn)的空數(shù)組,使用時(shí)才會(huì)開辟數(shù)組,默認(rèn)的開辟長(zhǎng)度為10;
JDK1.9之前:ArrayList默認(rèn)的構(gòu)造實(shí)際上就會(huì)默認(rèn)開辟大小為10的數(shù)組
當(dāng)ArrayList之中保存的容量不足的時(shí)候會(huì)采用成倍的方式進(jìn)行增長(zhǎng),原始長(zhǎng)度為10 ,下次的增長(zhǎng)就是20,如果在使用ArrayList子類的時(shí)候一定要估算出數(shù)據(jù)量有多少,如果超過了10個(gè),那么采用有參構(gòu)造的方法進(jìn)行創(chuàng)建,以避免垃圾數(shù)組的空間產(chǎn)生。
通過之前的分析已經(jīng)清楚了ArrayList子類的實(shí)現(xiàn)原理以及List核心操作,但是在測(cè)試的時(shí)候使用的是系統(tǒng)提供的String類,這是一個(gè)設(shè)計(jì)非常完善的類,而對(duì)于類集而言也可以實(shí)現(xiàn)自定義類對(duì)象的保存。
范例:實(shí)現(xiàn)自定義類對(duì)象保存
import java.util.ArrayList;import java.util.List;public class JavaAPIDemo {public static void main(String[] args) throws Exception { List<Person> all = new ArrayList<Person>(); all.add(new Person("張三", 30)); all.add(new Person("李四", 16)); all.add(new Person("小強(qiáng)", 78)); System.out.println(all.contains(new Person("小強(qiáng)", 78))); all.remove(new Person("小強(qiáng)", 78)); all.forEach(System.out::println); //方法引用代替了消費(fèi)型的接口/** * false * 姓名:張三、年齡:30 * 姓名:李四、年齡:28 * 姓名:小強(qiáng)、年齡:78 */} }class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age; }// setter、getter、構(gòu)造略public String toString() {return "姓名:" + this.name + "、年齡:" + this.age; } }
在使用List保存自定義對(duì)象時(shí),如果需要使用到contains()、remove()方法進(jìn)行查詢或刪除處理時(shí)一定要保證類中已經(jīng)覆寫了equals()方法。
class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age; }@Overridepublic boolean equals(Object obj) {if (this == obj) {return true; }if (obj == null) {return false; }if (!(obj instanceof Person)) {return false; } Person per = (Person) obj;return this.name.equals(per.name) && this.age == per.age; }// setter、getter、構(gòu)造略public String toString() {return "姓名:" + this.name + "、年齡:" + this.age; } }/** * true * 姓名:張三、年齡:30 * 姓名:李四、年齡:28 */
關(guān)于ArrayList子類的作用是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。