ArrayList封裝

来源:https://www.cnblogs.com/startSeven/archive/2018/12/25/10176698.html
-Advertisement-
Play Games

package com.cn.test.jihe; import java.util.Arrays; /** * * insert * delete * update * get * */ public class ArrayList { /** * Default initial capacity... ...


package com.cn.test.jihe;

import java.util.Arrays;

/**
* 
* insert
* delete
* update 
* get
*
*/
public class ArrayList {

/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};

Object[] elementData;

private int size;

protected int modCount = 0;

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

public ArrayList(int initialCapacity) throws Exception {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new Exception("illegal Capital" + initialCapacity);
}
}

public ArrayList() {
this.elementData = EMPTY_ELEMENTDATA;
}

public boolean add(Object obj) {
// 首先比較數組的長度
ensureCapitalInteral(size + 1);
elementData[size ++] = obj;
return false;
}

public void add(int index, Object obj) throws Exception {
/**
* 首先判斷要index的位置
*/
rangCheckForAdd(index);
ensureCapitalInteral(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = obj;
size++;
}

private void rangCheckForAdd(int index) throws Exception {
if (size < index || index < 0) {
throw new Exception("數組下標越界" + index);
}
}
boolean contains(Object o ) {
return indexOf(o) >= 0;
}

/**
* 返回位置上的下標
* @param index
* @return
* @throws Exception 
*/
Object get(int index) throws Exception {
rangeCheck(index);
return elementData[index];
}
/**
* 列表沒有元素返回true
* @return
*/
boolean isEmpty() {
return size == 0;
}

/**
* 返回此列表中最後一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。
* @param o
* @return
*/
int lastIndexOf(Object o) {
if (null == o) {
// 逆序迴圈數組
for (int i = size - 1; i >= 0; i--) {
if (null == elementData[i]) {
return i;
}
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (o.equals(elementData[i])) {
return i;
}
}
}

return -1;
}

/**
* 移除此列表中指定位置上的元素。向左移動所有後續元素(將其索引減 1)。
* @throws Exception 
*/
Object remove(int index) throws Exception {
// 下標的檢查
rangeCheck(index);
Object oldValue = elementData[index];
int numMove = size - index - 1;
if (numMove > 0) { // 表示刪除的不是最後一個元素
System.arraycopy(elementData, index + 1, elementData, index, numMove);
}
elementData[size--] = null;
return oldValue;
}

/**
* 移除此列表中首次出現的指定元素(如果存在)。如果列表不包含此元素,則列表不做改動。
*/
boolean remove(Object object) throws Exception {
// object 是否在該數組中
int index = indexOf(object);
if(index >= 0) {
// 刪除下標
int moveNum = size - index - 1;
if (moveNum > 0) {
System.arraycopy(elementData, index + 1, elementData, index, moveNum);
}
elementData[size--] = null;
return true;
}

return false;

}
/**
* 用指定的元素替代此列表中指定位置上的元素,
* 並且將舊元素返回
* @throws Exception 
*/
Object set(int index, Object element) throws Exception {
// 1. 判斷index的下標越界問題
rangeCheck(index);
Object oldValue = elementData[index];
elementData[index] = element;
return oldValue;

}

/**
* 按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的數組。
由於此列表不維護對返回數組的任何引用,,因而它將是“安全的”。(換句話說,此方法必須分配一個新的數組)。因此,調用者可以自由地修改返回的數組。
* @return
*/
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}

private void rangeCheck(int index) throws Exception {

if (size <= index) {
throw new Exception("下標越界" + index);
}

}

private int indexOf(Object o) {
if(null == o) {
for (int i =0; i<size; i++) {
if (elementData[i] == null) {
return i;
}
}
} else {
for (int i = 0; i <size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

public int size() {
return size;
}
private void ensureCapitalInteral(int minCapacity) {
ensureExplicitCapacity (calculateCapacity(elementData, minCapacity));
}


private void ensureExplicitCapacity(int calculateCapacity) {
modCount++;
if (calculateCapacity - elementData.length > 0) {
grow(calculateCapacity);
}

}

private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0) // int的數組超限
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0) {
newCapacity = hugeCapacity(minCapacity);
}
elementData = Arrays.copyOf(elementData, newCapacity);

}

private int hugeCapacity(int minCapacity) {
if (minCapacity < 0) {
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

private int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY,minCapacity);
}
return minCapacity;
}
}

  


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

-Advertisement-
Play Games
更多相關文章
  • 寫在前面 今天在瀏覽網站的時候,忽然一個莫名的鏈接指引著我跳轉到了半次元網站 打開之後,發現也沒有什麼有意思的內容,職業的敏感讓我瞬間聯想到了 ,這種網站必然會有這個的存在啊,於是乎,我準備好我的大爬蟲了。 把上面的鏈接打開之後,被我發現了吧,就知道我的第八感不錯滴。接下來就是找入口,一定要找到圖片 ...
  • 今天又看了下韓順平的SpringAOP的講解,講解的很透徹。仿照視頻自己使用下前置通知。 一、引出問題 有個介面TestServiceInter,有兩個實現方法TestService和Test2Service。他們都有sayHello();我們的需求是在調用這兩個方法之前,要先完成寫日誌的功能; 二 ...
  • StringBuilder與StringBuffer: StringBuilder:線程不安全 StringBuffer:線程安全 當我們在字元串緩衝區被多個線程使用時,JVM不能保證StringBuilder的操作是安全的,雖然它的速度最快,但是可以保證StringBuffer是可以正確操作的. ...
  • 我開始學習反射的初衷是為了理解Spring 里的控制反轉,其次可以利用反射來達到類中的解耦。 自己寫的一些心得,希望能幫到大家 1.反射指的是對象的反向處理操作,是根據對象來取得對象的來源信息。 反射的核心是:將類編譯的位元組碼映射成對應的Java類型 首先要理解,任何一個類的對象都可以通過Objec ...
  • 重載運算符 標準庫function的用法 問題:int(int, int)算不算一種比較通用的類型?? 比如函數: int add(int a, int b); 比如lambda:auto mod = \ "" {return a % b}; 比如函數對象類:int operator()(int a ...
  • demo目錄 RestDemo ├── App │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ ├── models.py 數據模型 │ ├── serializers.py 序列化模塊 │ ├── tests.py ...
  • 重載運算符 函數調用運算符 把一個類的對象a,當成函數來使用,比如a(),所以需要重載operator()方法。重載了函數調用運算符的類的對象,就是函數對象了。 還有什麼是函數對象呢??? lambda是函數對象 std::bind函數的返回值是函數對象 函數是函數對象 函數指針是函數對象 那函數對 ...
  • 使用 pathlib 更好地處理路徑 pathlib 是 Python 3 的預設模塊,幫助避免使用大量的 os.path.join()。 拼接操作符:/ Path對象 / Path對象 Path對象 / 字元串 字元串 / Path對象 分解 parts屬性,可以返迴路徑中的每一部分 joinpa ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...