最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度解析Java中ArrayList的使用

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

一、ArrayList是什么

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

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

import java.util.ArrayList;

ArrayList如何定義:

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

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

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

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

二、ArrayList的構(gòu)造方法

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

構(gòu)造方法1:

構(gòu)造一個(gè)空的順序表

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

構(gòu)造方法2:

構(gòu)造一個(gè)指定大小為5的順序表

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

構(gòu)造方法3:

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

此處構(gòu)造一個(gè)和list2元素一致的順序表

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

初始時(shí)的坑

List list = new ArrayList();

這樣對(duì)順序表進(jìn)行初始化的話,沒(méi)有指定任何類型,這樣的話可以存放任意類型的元素,這樣會(huì)存在很大的安全隱患。

三、ArrayList的常見(jiàn)方法

常見(jiàn)方法

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

remove方法

ArrayList提供給我們兩個(gè)remove方法

一個(gè)是傳入要?jiǎng)h除的下標(biāo),一個(gè)是要?jiǎng)h除的引用。

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類型那么我們刪除的是該下標(biāo)的數(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ā)生了變化。

因?yàn)樵诮厝≈蟛](méi)有復(fù)制一份內(nèi)容給list1,而是指向同一塊內(nèi)容。

遍歷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()返回迭代器寫一個(gè)元素,更新迭代器狀態(tài)
.hasNext()檢測(cè)集合中是否還有元素
.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方法只能刪除當(dāng)前指向的元素。

四、ArrayList的擴(kuò)容機(jī)制

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

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

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

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

那如何擴(kuò)容呢?

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

如果是無(wú)參構(gòu)造的話,就傳一個(gè)默認(rèn)大小和傳入大小的最大值。

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

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

但如果我們1.5倍擴(kuò)容的大小超過(guò)了這個(gè)指定的范圍2147483639時(shí)

系統(tǒng)會(huì)報(bào)一個(gè)內(nèi)存溢出異常。

1. 檢測(cè)是否真正需要擴(kuò)容,如果是調(diào)用grow準(zhǔn)備擴(kuò)容

2. 預(yù)估需要庫(kù)容的大小

初步預(yù)估按照1.5倍大小擴(kuò)容

如果用戶所需大小超過(guò)預(yù)估1.5倍大小,則按照用戶所需大小擴(kuò)容

真正擴(kuò)容之前檢測(cè)是否能擴(kuò)容成功,防止太大導(dǎo)致擴(kuò)容失敗

3. 使用copyOf進(jìn)行擴(kuò)容

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

相關(guān)文章

  • 解決Tomcat啟動(dòng)報(bào)異常java.lang.ClassNotFoundException問(wèn)題

    解決Tomcat啟動(dòng)報(bào)異常java.lang.ClassNotFoundException問(wèn)題

    這篇文章主要介紹了解決Tomcat啟動(dòng)報(bào)異常java.lang.ClassNotFoundException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Nacos啟動(dòng)出現(xiàn)failed to req API:/nacos/v1/ns/instance after all servers問(wèn)題

    Nacos啟動(dòng)出現(xiàn)failed to req API:/nacos/v1/ns/insta

    這篇文章主要介紹了Nacos啟動(dòng)出現(xiàn)failed to req API:/nacos/v1/ns/instance after all servers問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 零基礎(chǔ)寫Java知乎爬蟲(chóng)之準(zhǔn)備工作

    零基礎(chǔ)寫Java知乎爬蟲(chóng)之準(zhǔn)備工作

    上個(gè)系列我們從易到難介紹了如何使用python編寫爬蟲(chóng),小伙伴們反響挺大,這個(gè)系列我們來(lái)研究下使用Java編寫知乎爬蟲(chóng),小伙伴們可以對(duì)比這看下。
    2014-11-11
  • 關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動(dòng)態(tài)sql需要注意條件

    關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動(dòng)態(tài)sql需要注意條件

    這篇文章主要介紹了關(guān)于mybatis遇到Integer類型的參數(shù)時(shí)動(dòng)態(tài)sql需要注意條件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Springboot結(jié)合rabbitmq實(shí)現(xiàn)的死信隊(duì)列

    Springboot結(jié)合rabbitmq實(shí)現(xiàn)的死信隊(duì)列

    為了保證訂單業(yè)務(wù)的消息數(shù)據(jù)不丟失,需要使用到RabbitMQ的死信隊(duì)列機(jī)制,本文主要介紹了Springboot結(jié)合rabbitmq實(shí)現(xiàn)的死信隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • java多線程實(shí)現(xiàn)取款小程序

    java多線程實(shí)現(xiàn)取款小程序

    這篇文章主要為大家詳細(xì)介紹了java多線程實(shí)現(xiàn)取款小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Springboot教程之如何設(shè)置springboot熱重啟

    Springboot教程之如何設(shè)置springboot熱重啟

    這篇文章主要介紹了Springboot教程之如何設(shè)置springboot熱重啟,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • mybatis-plus的多租戶不同版本實(shí)現(xiàn)的兩種方式

    mybatis-plus的多租戶不同版本實(shí)現(xiàn)的兩種方式

    本文主要介紹了mybatis-plus的多租戶不同版本實(shí)現(xiàn)的兩種方式,Mybatis Plus 3.4.0版本之后多租戶的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Java中Lambda表達(dá)式使用詳細(xì)解讀

    Java中Lambda表達(dá)式使用詳細(xì)解讀

    這篇文章主要介紹了Java中Lambda表達(dá)式使用及詳解,lambda運(yùn)行將函數(shù)作為一個(gè)方法的參數(shù),也就是函數(shù)作為參數(shù)傳遞到方法中,使用lambda表達(dá)式可以讓代碼更加簡(jiǎn)潔,需要的朋友可以參考下
    2023-04-04
  • Spring Boot中使用JDBC Templet的方法教程

    Spring Boot中使用JDBC Templet的方法教程

    這篇文章主要給大家介紹了關(guān)于在Spring Boot中使用JDBC Templet的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評(píng)論

密山市| 象州县| 隆子县| 栾川县| 宣武区| 荥经县| 商丘市| 竹溪县| 肥西县| 区。| 崇左市| 凉城县| 四子王旗| 三门峡市| 曲靖市| 惠安县| 会同县| 新巴尔虎右旗| 什邡市| 罗源县| 宝鸡市| 勐海县| 道孚县| 临城县| 鱼台县| 南召县| 北碚区| 周至县| 茌平县| 措美县| 丹棱县| 阿鲁科尔沁旗| 固安县| 湛江市| 札达县| 奉化市| 景东| 藁城市| 新郑市| 蒙山县| 黑山县|