亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ArrayList子類的作用是什么

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

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

ArrayList子類

ArrayList是List子接口中使用最多的一個子類,但是這個子類在使用時也是有前提要求的,所以本次來對這個類的相關定義以及源代碼組成進行分析,在Java里面ArrayList類的定義如下:

public class ArrayList<E> extends AbstractList<E> mplements List<E>, RandomAccess, Cloneable, Serializable

ArrayList子類的作用是什么
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保存自定義類對象

通過之前的分析已經清楚了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子類的作用是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莒南县| 阳高县| 富民县| 乌拉特前旗| 彝良县| 巴南区| 河间市| 沧州市| 社会| 百色市| 绥德县| 垫江县| 芒康县| 马山县| 昌图县| 黄陵县| 太白县| 临武县| 丰城市| 南宁市| 广水市| 师宗县| 林西县| 浦北县| 周至县| 繁峙县| 鹤山市| 昂仁县| 延边| 绥中县| 嵊泗县| 贡嘎县| 鲁甸县| 从江县| 衡东县| 茂名市| 潜山县| 闸北区| 寿阳县| 元江| 南部县|