Java 動態數組

来源:https://www.cnblogs.com/chenyanbin/archive/2020/02/14/12306367.html

什麼是數據結構? 線性表 數組 動態數組設計 項目結構 代碼實現 CybArrayList.java package com.cyb; /** * 自定義ArrayList數組 * * @author chenyanbin * */ public class CybArrayList { /** * ...


什麼是數據結構?

 

線性表

 

數組

 

動態數組設計

 項目結構

代碼實現

CybArrayList.java

package com.cyb;

/**
 * 自定義ArrayList數組
 * 
 * @author chenyanbin
 *
 */
public class CybArrayList {
    /**
     * 元素的數量
     */
    private int size;
    /**
     * 所有元素
     */
    private int[] elements;
    private static final int DEFAULT_CAPACITY = 100;
    private static final int ELEMENT_NOT_FOUND = -1;

    public CybArrayList() {
        this(DEFAULT_CAPACITY);
    }

    public CybArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = new int[capacity];
    }

    /**
     * 元素的個數
     * 
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否為空
     * 
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某個元素
     * 
     * @param element 元素
     * @return
     */
    public boolean contains(int element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到最後面
     * 
     * @param element
     */
    public void add(int element) {
        add(size, element);
    }

    /**
     * 往index位置添加元素
     * 
     * @param index   索引下標
     * @param element 元素
     */
    public void add(int index, int element) {
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);
        for (int i = size - 1; i >= index; i--) {
            elements[i + 1] = elements[i];
        }
        elements[index] = element;
        size++;
    }

    /**
     * 返回index位置對應的元素
     * 
     * @param index 索引下標
     * @return
     */
    public int get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    /**
     * 設置index位置的元素
     * 
     * @param index   索引下標
     * @param element 元素
     * @return 原來的元素
     */
    public int set(int index, int element) {
        rangeCheck(index);
        int oldElement = elements[index];
        elements[index] = element;
        return oldElement;
    }

    /**
     * 刪除index位置對應的元素
     * 
     * @param index 索引下標
     * @return 刪除的元素值
     */
    public int remove(int index) {
        rangeCheck(index);
        int result = elements[index];
        for (int i = index + 1; i <= size - 1; i++) {
            elements[i - 1] = elements[i];
        }
        size--;
        return result;
    }

    /**
     * 查看元素的位置
     * 
     * @param element 元素
     * @return
     */
    public int indexOf(int element) {
        for (int i = 0; i < size; i++) {
            if (elements[i] == element)
                return i;
        }
        return ELEMENT_NOT_FOUND;
    }

    /**
     * 清除所有元素
     */
    public void clear() {
        size = 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("size=").append(size).append(",[");
        for (int i = 0; i < size; i++) {
            // 方式一(推薦)
            if (i > 0) {
                stringBuilder.append(",");
            }
            stringBuilder.append(elements[i]);
            // 方式二(不推薦)
//            if (i!=size-1) {
//                stringBuilder.append(",");
//            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
    }

    /**
     * 範圍檢測
     * 
     * @param index 索引下標
     */
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 範圍檢測
     * 
     * @param index 索引下標
     */
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /**
     * 保證要有capacity的容量
     * 
     * @param capacity 容量
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity)
            return;
        // 新容量為舊容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        int[] newElements = new int[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
        System.out.print("容量從"+oldCapacity+"擴展為"+newCapacity+"\n");
    }
}

泛型

  使用泛型技術可以讓動態數組更加通用,可以存放任何數據類型

CybArrayList.java(泛型)

package com.cyb;

/**
 * 自定義ArrayList數組
 * 
 * @author chenyanbin
 *
 */
public class CybArrayList<E> {
    /**
     * 元素的數量
     */
    private int size;
    /**
     * 所有元素
     */
    private E[] elements;
    private static final int DEFAULT_CAPACITY = 100;
    private static final int ELEMENT_NOT_FOUND = -1;

    public CybArrayList() {
        this(DEFAULT_CAPACITY);
    }

    @SuppressWarnings("unchecked")
    public CybArrayList(int capacity) {
        capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
        elements = (E[]) new Object[capacity];
    }

    /**
     * 元素的個數
     * 
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否為空
     * 
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某個元素
     * 
     * @param element 元素
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /**
     * 添加元素到最後面
     * 
     * @param element
     */
    public void add(E element) {
        add(size, element);
    }

    /**
     * 往index位置添加元素
     * 
     * @param index   索引下標
     * @param element 元素
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);
        ensureCapacity(size + 1);
        for (int i = size; i > index; i--) {
            elements[i] = elements[i - 1];
        }
        elements[index] = element;
        size++;
    }

    /**
     * 返回index位置對應的元素
     * 
     * @param index 索引下標
     * @return
     */
    public E get(int index) {
        rangeCheck(index);
        return elements[index];
    }

    /**
     * 設置index位置的元素
     * 
     * @param index   索引下標
     * @param element 元素
     * @return 原來的元素
     */
    public E set(int index, E element) {
        rangeCheck(index);
        E oldElement = elements[index];
        elements[index] = element;
        return oldElement;
    }

    /**
     * 刪除index位置對應的元素
     * 
     * @param index 索引下標
     * @return 刪除的元素值
     */
    public E remove(int index) {
        rangeCheck(index);
        E result = elements[index];
        for (int i = index + 1; i < size; i++) {
            elements[i - 1] = elements[i];
        }
        elements[--size] = null;
        return result;
    }

    /**
     * 刪除對象
     * 
     * @param element 對象
     */
    public void remove(E element) {
        remove(indexOf(element));
    }

    /**
     * 查看元素的位置
     * 
     * @param element 元素
     * @return
     */
    @SuppressWarnings("null")
    public int indexOf(E element) {
        if (element == null) {
            for (int i = 0; i < size; i++) {
                if (elements[i] == null)
                    return i;
            }
        } else {
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i]))
                    return i;
            }
        }

        return ELEMENT_NOT_FOUND;
    }

    /**
     * 清除所有元素
     */
    public void clear() {
        for (int i = 0; i < size; i++) {
            elements[i] = null;
        }
        size = 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("size=").append(size).append(",[");
        for (int i = 0; i < size; i++) {
            // 方式一(推薦)
            if (i > 0) {
                stringBuilder.append(",");
            }
            stringBuilder.append(elements[i]);
            // 方式二(不推薦)
//            if (i!=size-1) {
//                stringBuilder.append(",");
//            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

    private void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size);
    }

    /**
     * 範圍檢測
     * 
     * @param index 索引下標
     */
    private void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 範圍檢測
     * 
     * @param index 索引下標
     */
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    /**
     * 保證要有capacity的容量
     * 
     * @param capacity 容量
     */
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity)
            return;
        // 新容量為舊容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        @SuppressWarnings("unchecked")
        E[] newElements = (E[]) new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
        System.out.print("容量從" + oldCapacity + "擴展為" + newCapacity + "\n");
    }
}

您的分享是我們最大的動力!

更多相關文章
  • 【基礎】多線程 標簽(空格分隔): javaweb 多線程 [TOC] 1、線程概念 簡單理解,一個客戶端可以同時做很多事,就是多線程 2、創建線程(三種方法) 1. 繼承線程類,例如: 2. 繼承線程類,例如: 3. 匿名類 to do more··· ...
  • django快速安裝指南 作為一個Python Web框架,Django需要Python環境。下麵是Django需要對應的python版本。 Django版本 python版本 1.11 2.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17) 2.0 3.4, 3.5, ...
  • 歡迎訪問我的 "博客" 和 "github" ! go 語言學習筆記第一彈,來自 "gotour" ,以後要常寫筆記,把自己學習筆記記錄下來,就算只是筆記也要多寫。 好記性不如爛筆頭,也要多鍛煉自己的寫作能力。 說實話,今天很累了,最近在折騰操作系統內核,因為原先寫了個bootloader,現在想要 ...
  • JavaSE學習筆記(14) File類和IO流(位元組流和字元流) File類 概述 類是文件和目錄路徑名的抽象表示,主要用於文件和目錄的創建、查找和刪除等操作。 構造方法 :通過將給定的 路徑名字元串 轉換為抽象路徑名來創建新的 File實例。 :從 父路徑名字元串和子路徑名字元串 創建新的 Fi ...
  • 開發環境: Windows操作系統開發工具:Myeclipse+Jdk+Tomcat+mysql資料庫運行效果圖 源碼及原文鏈接:http://javadao.xyz/forum.php?mod=viewthread&tid=34 ...
  • JavaSE學習筆記(13) 線程池、Lambda表達式 1、等待喚醒機制 線程間通信 概念: 多個線程在處理同一個資源,但是處理的動作(線程的任務)卻不相同。 比如:線程A用來生成包子的,線程B用來吃包子的,包子可以理解為同一資源,線程A與線程B處理的動作,一個是生產,一個是消費,那麼線程A與線程 ...
  • 本人淺析傳統IT系統層面的系統監控,不涉及k8s以及Service Mesh,拋磚引玉。 隨著系統增多,我們需要一套能夠立體化監控系統去監控你的應用及業務,出現問題能夠及時告警,或通過大屏、簡訊和郵件。 我個人認為監控應該從三個方面進行入手,即:Metrics、Logging、Tracing。 Me ...
  • 今日內容 複習 內容詳細 1.Python入門 1.1 環境的搭建 mac系統上搭建python環境。 環境變數的作用:方便在命令行(終端)執行可執行程式,將可執行程式所在的目錄添加到環境變數,那麼以後無需再輸入路徑。 1.2 變數命名 變數 全局變數 函數 常量 1.3 運算符 is和==的區別? ...
一周排行
  • 枚舉是 C 中最有意思的一部分,大部分開發人員只瞭解其中的一小部分,甚至網上絕大多數的教程也只講解了枚舉的一部分。那麼,我將通過這篇文章向大傢具體講解一下枚舉的知識。我將從大家都瞭解的部分開始講解,然後再講解大家所不知道的或者瞭解很少的部分。 零、基礎知識 枚舉是由開發人員聲明的一種 值類型 ,它在 ...
  • 一. elasticsearch on windows 1.下載地址: https://www.elastic.co/cn/downloads/elasticsearch 如果瀏覽器下載文件慢,建議使用迅雷下載,速度很快。下載版本為7.5.2 2. 修改配置文件 下載後解壓,找到config\jvm ...
  • 最近因為” 新冠” 疫情在家辦公,學習了 ASP.NET Core MVC 網站的一些知識,記錄如下。 ...
  • Regex.Replace("<!--(.|[\r\n])*?-->",string.Empty) ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7743118.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講結構型設計模式的第四個模式--組合模式。當我們談到這個模式的時候,有一個物件和這個模式很像,那就是“俄羅斯套娃”。“俄羅斯套娃”是 ...
  • 一、前言 Entity Framework(後面簡稱EF)作為微軟家的ORM,自然而然從.NET Framework延續到了.NET Core。 二、程式包管理器控制台 為了能夠在控制臺中使用命令行來操作EF,需要先安裝Microsoft.EntityFrameworkCore.Tools。 安裝 ...
  • 項目gitHub地址 點我跳轉 今天給大家帶來一個C#裡面的時間工具類,具體的直接看下麵代碼 1 using System; 2 3 namespace ToolBox.DateTimeTool 4 { 5 public static class DateTimeExtend 6 { 7 /// < ...
  • 《C# 6.0 本質論》 [作者] (美) Mark Michaelis (美) Eric Lippert[譯者] (中) 周靖 龐燕[出版] 人民郵電出版社[版次] 2017年02月 第5版[印次] 2017年02月 第1次 印刷[定價] 108.00元 【前言】 成功學習 C# 的關鍵在於,要盡 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7772184.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講結構型設計模式的第五個模式--外觀模式。先從名字上來理解一下外觀模式,當看到“外觀”這個詞時,很容易想到“外表”這個詞語,兩者有著 ...
  • 在 C 中存在一個名叫靜態類型檢查的機制,這個機制可以讓編譯器幫助我們把類型不服的用法找出來,從而使得應用程式在運行期間加少一些類型檢查的操作。但是有時候我們還是需要進行運行期類型檢查,比如我們在設計框架時將方法的參數類型定義為 object ,那麼這時我們就有很大的可能需要將 object 類型的 ...
x