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