溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ArrayList子類的作用是什么

發(fā)布時(shí)間:2021-08-06 15:09:23 來源:億速云 閱讀:123 作者:Leah 欄目:編程語言

ArrayList子類的作用是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

ArrayList子類

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子類的作用是什么
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)生。

ArrayList保存自定義類對(duì)象

通過之前的分析已經(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í)。

向AI問一下細(xì)節(jié)

免責(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)容。

AI