国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題

這篇具有很好參考價值的文章主要介紹了Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

引出


1.ArrayList的結(jié)構(gòu)分析,可迭代接口,是List的實現(xiàn);
2.數(shù)組增加元素和刪除元素的分析,何時擴容,如何擴容;
3.插入數(shù)據(jù)的復(fù)雜度O(N);
4.數(shù)組特點:查找和修改容易O(1);增加和刪除復(fù)雜O(N);文章來源地址http://www.zghlxwxcb.cn/news/detail-655870.html

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

手動實現(xiàn)ArrayList

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

定義接口MyList<T>

package com.tianju.book.jpa.mlist;

/**
 * 手工打造ArrayList
 */
public interface MyList<T> {
    /**
     * 增加一個元素,涉及到容量的變化
     */
    void add(T t);

    /**
     * 根據(jù)索引刪除元素
     * @param index 要刪除元素的索引,超過索引?索引不存在?
     */
    void remove(int index);

    /**
     * 根據(jù)索引修改一個元素
     * @param index 要修改的索引
     * @param t 修改的值
     */
    void set(int index,T t);

    /**
     * 根據(jù)索引獲取元素
     * @param index 索引
     * @return 獲取的元素
     */
    T get(int index);

    int size();

    String toString();

}

寫ArrayList的實現(xiàn)類

增加元素

  • 如果放不下怎么辦?如何擴容?
  • 擴容后如何操作?

擴容:每次為原來的1.5倍

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

如果放不下,就擴容;

擴容后把原來的數(shù)據(jù)一個一個再放回去;

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

刪除元素

源碼分析

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

  • 刪除頭部,尾部,中間——最一般的就是中間元素被刪除;
  • 此時需要跳過被刪除的元素,把沒有被刪除的放回去;

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

package com.tianju.book.jpa.mlist;

public class MyArrayList<T> implements MyList<T> {

    private int size; // 不寫初始值為0

    private Object[] elementData = new Object[5]; // 自己的ArrayList的默認大小是5


    @Override
    public void add(T t) {
        // 如果放不下就要擴容
        if (size+1>=elementData.length){
            // >> 位運算,右移相當于除以2,所以新的長度是原來的1.5倍
            int newLen = elementData.length + (elementData.length>>1);
            // 這里相當于新建一個數(shù)組,把原來的一個一個放進去,然后把elementData指向新的數(shù)組
//            elementData = Arrays.copyOf(elementData, newLen); // arrays工具類的實現(xiàn)
            Object[] newElementData = new Object[newLen];
            for(int i=0;i<elementData.length;i++){
                newElementData[i] = elementData[i];
            }
            elementData = newElementData;
            System.out.println("擴容后長度"+elementData.length);
        }
        elementData[size] = t;//把新的元素放過來
        size = size + 1; // 新的size比原來加1
    }

    @Override
    public void remove(int index) {
        // 刪除怎么搞?
        // 刪除頭部?尾部?中間?
        // 這里采用新建一個數(shù)組,跳過要刪除的那個元素,一個一個再放回去
        Object[] newElementData = new Object[elementData.length]; // 和原來大小一樣
        int j = 0; // 新的索引
        for (int i=0;i<size;i++){
            if (i==index){
                System.out.println(index+"跳過: "+elementData[i]);
                continue;
            }
            newElementData[j] = elementData[i];
            j++; // 跳過被刪除的那個索引
        }
        elementData = newElementData; // 再指向新的數(shù)組
        size--; // 刪除元素后size-1

    }

    @Override
    public void set(int index, T t) {
        // 修改的復(fù)雜度為O(1)
        if (index>=size){
            throw new IndexOutOfBoundsException("索引越界");
        }
        elementData[index] = t;

    }

    @Override
    public T get(int index) {
        // 根據(jù)索引獲取元素的復(fù)雜度也為O(1)
        // 需要判斷索引是不是超了
        if (index>=size){
            throw new IndexOutOfBoundsException("索引越界");
        }
        return (T) elementData[index];

    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public String toString(){
        String str ="[";
        for (int i =0;i<size;i++){
            str += elementData[i] + ",";
        }
        str +="]";
        return str;
    }
}

寫測試類進行測試

package com.tianju.book.jpa.mlist;


import java.util.ArrayList;
import java.util.List;

public class MyListTest {
    public static void main(String[] args) {
        MyList<String> myList = new MyArrayList<>();
        System.out.println(myList.size());
        myList.add("Peter001");
        myList.add("Peter002");
        myList.add("Peter003");
        myList.add("Peter004");
        System.out.println(myList.size());
        myList.add("Peter005");
        System.out.println("目前List中元素的數(shù)量"+myList.size());
        System.out.println(myList);

        System.out.println("*******刪除一個元素*******");
        myList.remove(1);
        System.out.println(myList);
        System.out.println("刪除元素后list長度:"+myList.size());

        myList.add("shirley");
        System.out.println("新增shirley元素后list:"+myList);
        System.out.println("長度:"+myList.size());

        System.out.println("*******修改一個元素*******");
        myList.set(0, "zgg");
        System.out.println(myList);

        System.out.println("*******查詢一個元素*******");
        String s = myList.get(2);
        System.out.println("索引為2的元素為:"+s);

        System.out.println("索引越界的情況");
        System.out.println(myList.get(10));


        List<String> strings = new ArrayList<>();
        System.out.println(strings.size());

    }
}

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

數(shù)組插入數(shù)據(jù)?

Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題,Java,java,windows,開發(fā)語言

插人和刪除的花費卻潛藏著昂貴的開銷,這要看插入和刪除發(fā)生在什么地方。最壞的情形下,在位置0的插入(即在表的前端插入)首先需要將整個數(shù)組后移一個位置以空出空間來,而刪除第一個元素則需要將表中的所有元素前移一個位置,因此這兩種操作的最壞情況為O(N)。

平均來看,這兩種操作都需要移動表的一半的元素,因此仍然需要線性時間。另一方面,如果所有的操作都發(fā)生在表的高端,那就沒有元素需要移動,而添加和刪除則只花費O(1)時間。

存在許多情形,在這些情形下的表是通過在高端進行插入操作建成的,其后只發(fā)生對數(shù)組的訪問(即只有findKth操作)。在這種情況下,數(shù)組是表的一種恰當?shù)膶崿F(xiàn)。然而,如果發(fā)生對表的一些插入和刪除操作,特別是對表的前端進行,那么數(shù)組就不是一種好的選擇。另一種數(shù)據(jù)結(jié)構(gòu):鏈表(linked list)。


總結(jié)

1.ArrayList的結(jié)構(gòu)分析,可迭代接口,是List的實現(xiàn);
2.數(shù)組增加元素和刪除元素的分析,何時擴容,如何擴容;
3.插入數(shù)據(jù)的復(fù)雜度O(N);
4.數(shù)組特點:查找和修改容易O(1);增加和刪除復(fù)雜O(N);

到了這里,關(guān)于Java進階(3)——手動實現(xiàn)ArrayList & 源碼的初步理解分析 & 數(shù)組插入數(shù)據(jù)和刪除數(shù)據(jù)的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 源碼分析——ArrayList源碼+擴容機制分析

    ArrayList 的底層是數(shù)組隊列,相當于動態(tài)數(shù)組。與 Java 中的數(shù)組相比,它的容量能動態(tài)增長。在添加大量元素前,應(yīng)用程序可以使用 ensureCapacity 操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數(shù)量。 ArrayList 繼承于 AbstractList ,實現(xiàn)了 List , RandomAccess , Cloneable , ja

    2024年02月14日
    瀏覽(19)
  • ArrayList 底層結(jié)構(gòu)和源碼分析

    ArrayList 實現(xiàn)了 List 接口。它可以存儲包括 null 的任何類型的對象,允許重復(fù)元素。 ArrayList 在內(nèi)部使用一個數(shù)組來存儲元素,當元素數(shù)量超過數(shù)組容量時, ArrayList 會自動重新分配更大的內(nèi)部數(shù)組,并且將現(xiàn)有元素復(fù)制到新數(shù)組中。 ArrayList 基本等同于 Vector ,但是 ArrayList 是

    2024年02月08日
    瀏覽(23)
  • ArrayList 底層結(jié)構(gòu)及源碼分析

    ArrayList 實現(xiàn)了 List 接口。它可以存儲包括 null 的任何類型的對象,允許重復(fù)元素。 ArrayList 在內(nèi)部使用一個數(shù)組來存儲元素,當元素數(shù)量超過數(shù)組容量時, ArrayList 會自動重新分配更大的內(nèi)部數(shù)組,并且將現(xiàn)有元素復(fù)制到新數(shù)組中。 ArrayList 基本等同于 Vector ,但是 ArrayList 是

    2024年02月08日
    瀏覽(20)
  • ArrayList底層結(jié)構(gòu)和源碼分析

    1.permits all elements, including null,ArrayList 可以加入null,并且多個 2.ArrayList是由數(shù)組來實現(xiàn)數(shù)據(jù)存儲的 3.ArrayList 基本等同于Vector,除了ArrayList是線程不安全(執(zhí)行效率高)看源碼.在多線程情況下,不建議使用ArrayList 代碼演示: ArrayList的底層操作機制源碼分析 (重點,難點.) 1.Arra

    2023年04月24日
    瀏覽(19)
  • 自然語言處理的崛起:從初步分析到深度理解

    自然語言處理的崛起:從初步分析到深度理解

    自然語言處理(NLP)是計算機科學(xué)、人工智能和語言學(xué)的交叉領(lǐng)域,旨在讓計算機能夠理解和生成人類語言。隨著時間的推移,NLP 經(jīng)歷了一系列革命性的變化,從簡單的規(guī)則和模式匹配到如今的深度學(xué)習(xí)模型,它們使計算機的理解能力接近人類水平。 早期的NLP系統(tǒng)基于一系

    2024年01月23日
    瀏覽(32)
  • Java進階(HashMap)——面試時HashMap常見問題解讀 & 結(jié)合源碼分析

    Java進階(HashMap)——面試時HashMap常見問題解讀 & 結(jié)合源碼分析

    List、Set、HashMap作為Java中常用的集合,需要深入認識其原理和特性。 本篇博客介紹常見的關(guān)于Java中HashMap集合的面試問題,結(jié)合源碼分析題目背后的知識點。 關(guān)于List的博客文章如下: Java進階(List)——面試時List常見問題解讀 結(jié)合源碼分析 關(guān)于的Set的博客文章如下: Jav

    2024年02月08日
    瀏覽(24)
  • Java進階(List)——面試時List常見問題解讀 & 結(jié)合源碼分析

    Java進階(List)——面試時List常見問題解讀 & 結(jié)合源碼分析

    List、Set、HashMap作為Java中常用的集合,需要深入認識其原理和特性。 本篇博客介紹常見的關(guān)于Java中List集合的面試問題,結(jié)合源碼分析題目背后的知識點。 關(guān)于的Set的博客文章如下: Java進階(Set)——面試時Set常見問題解讀 結(jié)合源碼分析 關(guān)于HaseMap的博客文章如下: Java進

    2024年02月06日
    瀏覽(30)
  • 【Java集合進階】Collection 體系集合詳解(ArrayList,LinkedList,HashSet,TreeSet...)
  • 初步理解android studio里java(generated)

    初步理解android studio里java(generated)

    ? 總結(jié)在最下面 ?最近學(xué)習(xí)android studio的時候,發(fā)現(xiàn)了一個問題,就是為什么有的項目有java(generated),res(generated)。而有的項目里就沒有,從網(wǎng)上進行搜索之后了解到 當使用一些庫的時候 ,例如 Dagger(目前不知道是什么),Room(也不知道是個啥),Navigation組件(終于

    2024年02月06日
    瀏覽(16)
  • 深入理解python虛擬機:調(diào)試器實現(xiàn)原理與源碼分析

    深入理解python虛擬機:調(diào)試器實現(xiàn)原理與源碼分析

    調(diào)試器是一個編程語言非常重要的部分,調(diào)試器是一種用于診斷和修復(fù)代碼錯誤(或稱為 bug)的工具,它允許開發(fā)者在程序執(zhí)行時逐步查看和分析代碼的狀態(tài)和行為,它可以幫助開發(fā)者診斷和修復(fù)代碼錯誤,理解程序的行為,優(yōu)化性能。無論在哪種編程語言中,調(diào)試器都是一

    2023年04月26日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包