欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深度解析Java中ArrayList的使用

 更新時間:2022年09月19日 14:27:10   作者:熬夜磕代碼丶  
ArrayList?類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。本文將通過示例帶你深度解析Java中ArrayList的使用,需要的可以參考一下

一、ArrayList是什么

ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。ArrayList 繼承了 AbstractList ,并實現(xiàn)了 List 接口。

我們發(fā)現(xiàn)ArrayList類位于java.util包中,使用之前需要去引入它.

import java.util.ArrayList;

ArrayList如何定義:

ArrayList<E> arrayList = new ArrayList<E>();

此數(shù)E為泛型實參類型,只能為引用數(shù)據(jù)類型,ArrayList想存儲什么類型的數(shù)據(jù),我們就傳什么就可以。

List<E> list = new ArrayList<E>();

因我們的ArrayList是繼承于List的,所以我們可以用父類去接受子類對象,向上轉型。

二、ArrayList的構造方法

我們發(fā)現(xiàn)ArrayList一共提供了三種構造方法。

構造方法1:

構造一個空的順序表

List<Integer> list = new ArrayList<>();

構造方法2:

構造一個指定大小為5的順序表

List<Integer> list = new ArrayList<>(5);

構造方法3:

此處傳入的要么是自己本身類型,或者是子類類型。

此處構造一個和list2元素一致的順序表

List<Integer> list2 = new ArrayList<>(5);        List<Integer> list = new ArrayList<>(list2);

初始時的坑

List list = new ArrayList();

這樣對順序表進行初始化的話,沒有指定任何類型,這樣的話可以存放任意類型的元素,這樣會存在很大的安全隱患。

三、ArrayList的常見方法

常見方法

在我的上一篇實現(xiàn)順序表中,已經(jīng)把大多數(shù)方法手動實現(xiàn)了一遍,此處我在說明幾個重點的。

remove方法

ArrayList提供給我們兩個remove方法

一個是傳入要刪除的下標,一個是要刪除的引用。

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(8);
        list.remove(1);
        System.out.println(list);
    }

如果我們傳入的是int類型那么我們刪除的是該下標的數(shù)據(jù)。

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(8);
        list.remove(new Integer(10));
        System.out.println(list);
    }

如果我們傳入的是引用數(shù)據(jù)類型,那么將刪除該順序表中的該引用數(shù)據(jù)。

subList方法

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println("截取之前的list:"+list);
        List<Integer> list1 = list.subList(1,3);
        list1.set(0,5);
        System.out.println("截取之后的list:"+list);
    }

為啥改了list1之后,list的數(shù)據(jù)也發(fā)生了變化。

因為在截取之后并沒有復制一份內容給list1,而是指向同一塊內容。

遍歷ArrayList

方法1:

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();
    }

方法2:

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for (Integer x:list) {
            System.out.print(x+" ");
        }
        System.out.println();
    }

方法3:

使用迭代器

方法作用
.next()返回迭代器寫一個元素,更新迭代器狀態(tài)
.hasNext()檢測集合中是否還有元素
.remove()將迭代器返回的元素刪除
public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next()+" ");
        }
        System.out.println();
    }

使用迭代器刪除元素

我們刪除集合小于3的元素

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()) {
            if(it.next() < 3) {
                it.remove();
            }
        }
        System.out.println(list);
    }

迭代器的remove方法只能刪除當前指向的元素。

四、ArrayList的擴容機制

List<Integer> list = new ArrayList<>();

很多資料都在說這樣初始化一個集合,說默認大小為10,那事實到底是不是如此呢?我們一步步查看源碼一探究竟。

我們發(fā)現(xiàn)當前引用指向后面那個引用

我們發(fā)現(xiàn)這里的引用是一個空引用,初始集合時,是一個空集合。

那如何擴容呢?

既然我們的順序表是空的,那如何add呢?

如果是無參構造的話,就傳一個默認大小和傳入大小的最大值。

我們可以發(fā)現(xiàn)如果大于數(shù)組大小時,就會grow。

我們可以發(fā)現(xiàn)計算一個新容量,和我們傳入的大小做比較,如果新容量小于傳入的大小時,指定當前集合大小為傳入的大小。否則,對集合大小進行1.5倍擴容。

但如果我們1.5倍擴容的大小超過了這個指定的范圍2147483639時

系統(tǒng)會報一個內存溢出異常。

1. 檢測是否真正需要擴容,如果是調用grow準備擴容

2. 預估需要庫容的大小

初步預估按照1.5倍大小擴容

如果用戶所需大小超過預估1.5倍大小,則按照用戶所需大小擴容

真正擴容之前檢測是否能擴容成功,防止太大導致擴容失敗

3. 使用copyOf進行擴容

到此這篇關于深度解析Java中ArrayList的使用的文章就介紹到這了,更多相關Java ArrayList內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring security數(shù)據(jù)庫表結構實例代碼

    spring security數(shù)據(jù)庫表結構實例代碼

    這篇文章主要介紹了spring security數(shù)據(jù)庫表結構實例代碼,需要的朋友可以參考下
    2017-09-09
  • Java反射的兩種使用方法(推薦)

    Java反射的兩種使用方法(推薦)

    這篇文章主要介紹了Java反射的兩種使用方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • Springcloud Config配置中心使用與相關介紹

    Springcloud Config配置中心使用與相關介紹

    springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應用
    2022-09-09
  • java設計模式之外觀模式學習筆記

    java設計模式之外觀模式學習筆記

    這篇文章主要為大家詳細介紹了java設計模式之外觀模式學習筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 一篇文章帶你深入了解Java基礎(2)

    一篇文章帶你深入了解Java基礎(2)

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • SpringCloud之分布式配置中心Spring Cloud Config高可用配置實例代碼

    SpringCloud之分布式配置中心Spring Cloud Config高可用配置實例代碼

    這篇文章主要介紹了SpringCloud之分布式配置中心Spring Cloud Config高可用配置實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • HttpClient實現(xiàn)調用外部項目接口工具類的示例

    HttpClient實現(xiàn)調用外部項目接口工具類的示例

    下面小編就為大家?guī)硪黄狧ttpClient實現(xiàn)調用外部項目接口工具類的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java 包和訪問權限操作

    Java 包和訪問權限操作

    這篇文章主要介紹了Java 包和訪問權限操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • mybatis動態(tài)sql之Map參數(shù)的講解

    mybatis動態(tài)sql之Map參數(shù)的講解

    今天小編就為大家分享一篇關于mybatis動態(tài)sql之Map參數(shù)的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java8使用stream實現(xiàn)list中對象屬性的合并(去重并求和)

    Java8使用stream實現(xiàn)list中對象屬性的合并(去重并求和)

    這篇文章主要介紹了Java8使用stream實現(xiàn)list中對象屬性的合并(去重并求和),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01

最新評論