1. 程式人生 > >簡單ArrayList、LinkedList、HashSet、HashMap實現(一)

簡單ArrayList、LinkedList、HashSet、HashMap實現(一)

面試或筆試中經常遇到像ArrayListLinkedList以及HashSetHashMap有什麼區別,或者問你HashMap如何實現的。下面我們就自己實現簡單的集合類,完成我們平時經常使用的效果,比如新增、移除、返回長度、自動擴容。

ArrayList

下面是ArrayList的常用方法

我們就照著功能實現這些方法,首先要知道ArrayList的底層實現是陣列,而他比陣列方便的地方在於可以自動擴容,陣列一旦聲明瞭大小就不可改變,那ArrayList底層是陣列又是怎麼實現陣列擴容的呢。我們知道陣列是引用資料型別,內容不可改變但是可以改變引用的指向,說白了就是重新建立一個新的更大的陣列,然後把原來陣列的內容拷貝到新的陣列,再將原來的引用指向新的陣列,這樣就實現了數字的擴容

下面是java原始碼中實現陣列擴容

 

下面我們來實現自己的程式碼

public class MyArrayList {
//底層實現是一個物件陣列,宣告Object可以存放任意型別
private Object[] elementData;
//表示陣列中元素的多少
private int size;

//有參構造器,可直接從原始碼中拷貝
public MyArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else {
//丟擲異常
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } //無參構造器,提供預設引數 public MyArrayList(){ this(10); } //實現新增方法 public boolean add(Object object){ ensureCapacityInternal(size);// 驗證是否需要擴容 elementData[size++] = object; return true; } public boolean add(int index, Object obj){ checkIndex(index);
ensureCapacityInternal(size);// 驗證是否需要擴容 System.arraycopy(elementData, index, elementData, index+1, size-index); elementData[index] = obj; size ++ ; return true; } //set方法,改變某一下標的值 public Object set(int index , Object obj){ checkIndex(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } //取值 public Object get(int index){ checkIndex(index); return elementData[index]; } //判斷是否為空 public boolean isEmpty(){ return size==0; } //找出元素位置 public int indexOf(Object o) { if (o == null) { 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 Object remove(int index) { checkIndex(index); Object oldValue = elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; } public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { remove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { remove(index); return true; } } return false; } // 驗證是否需要擴容 private void ensureCapacityInternal(int i) { if(i == elementData.length) {//需要擴容 //建立一個兩倍於原陣列的新陣列 Object[] newElementData =new Object[size*2]; //拷貝舊陣列到新陣列 System.arraycopy(elementData,0,newElementData,0,elementData.length); //將引用指向新陣列 elementData = newElementData; } } //檢查下標是否越界 private void checkIndex(int index){ if(index<0 || index >= size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args){ MyArrayList list = new MyArrayList(); list.add("hello"); list.add("world");
	list.add("ni");
	list.add("hao");
       System.out.println(list.size);
       System.out.println(list.elementData.length);
    }
}

相關推薦

簡單ArrayListLinkedListHashSetHashMap實現

面試或筆試中經常遇到像ArrayList和LinkedList以及HashSet和HashMap有什麼區別,或者問你HashMap如何實現的。下面我們就自己實現簡單的集合類,完成我們平時經常使用的效果

PHPMySQL和JavaScript學習手冊筆記

本地 後端 驗證 css 考題 php 語言 html oot 第一章思考題1.創建一個完全動態網頁至少需要哪四大要素?服務器 動態語言php js 數據庫2.html代表超文本xxx3.因為sql分支用sql語言4.php用在服務器端 處理後端任務 js用在客戶端 本地驗

angularjs手機webapp 利用input拍照,相簿選擇縮圖顯示 上傳圖片

執行後的截圖: html程式碼 <ul class="list_img"> <li ng-repeat="imageSrc in imgshows track by $index"> <img n

S5PV210的啟動流程詳解

210整個啟動流程可以大致分為三個階段,分別為:      1.執行IROM中的程式碼       2.執行UBOOT的BL1       3.執行UBOOT的BL2,最後啟動核心 IROM是2

Java常用的八種排序演算法與程式碼實現:氣泡排序法插入排序法選擇排序法

這三種排序演算法適合小規模資料排序 ---   共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)   不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 ---   穩定排序演算法:可以保持數值相等的兩個物件,在排序之

C#基於TCPUDP協議的網路通訊實現unity

一、TCP協議: TCP協議是面向有連線的,所以伺服器要與客戶端建立連線 伺服器端: using System; using System.Net.Sockets; using System.Net; using System.Text; public static

tomcat原理及安裝及反向代理會話保持session叢集和session共享伺服器的實現

JDK(java development kit)叫做java開發工具包,是整個java的核心,包括JRE(java runtime environment,叫做java執行是環境),一堆java的工具和java的基本類庫。 JDK包含的元件包括:        java

PyQt5 QTableWidget表單控制元件自適應視窗大小欄位大小調整及佈局

目錄 前言 前言 還好,我有C++ Qt Help(幫助文件)O(∩_∩)O哈哈~ 本文旨在介紹QTableWidget(表單控制元件)的自適應視窗大小、欄位大小調整及佈局。 用QtDesigner設計UI 1. 先用QtDe

Android開發,MapBox的使用及部分功能實現----- 初始化標記定位styleurl

近期,應公司要求,開始接觸MapBox For Android的開發。 經過初步的接觸,發現MapBox與我之前使用的Arcgis有很多不同,相比起來,MapBox更清潔,更輕便,也更容易使用,但是相對的,MapBox相對於Arcgis缺少了很多的功能實現,許多的東西都需要

多種排序算法的思路和簡單代碼的實現

insert i++ 前後端 分享 size quicksort 執行 判斷 clas 就自己簡單的理解了一些排序算法(JAVA)思路和代碼分享給大家:歡迎大家進行交流。 直接插入排序,折半插入排序,冒泡排序,快速排序 1 public class Sort { 2

KVM虛擬化的四種簡單網絡模型介紹及實現

_for only 應該 code eth tun x86_64 信息 dock KVM中的四種簡單網絡模型,分別如下:1、隔離模型:虛擬機之間組建網絡,該模式無法與宿主機通信,無法與其他網絡通信,相當於虛擬機只是連接到一臺交換機上。2、路由模型:相當於虛擬機連接到一臺路由

從零開始Rtklib解讀篇-簡單的程式設計理論和演算法及結構分析

Rtklib一直開源,資源比較容易找到,功能也非常強大。因為專業有點相關,但是之前不用這個平臺,一直未能好好沉下心來學習,然而學到用時方恨少。這個系列也算是自己的一個小小的總結吧,因為我對VS、對Rtklib、對演算法的理解也比較淺,很多內容未必正確,寫的時候也不一定非常有條理,不當之處,還請指出並

JAVA高階基礎8---Set的典型實現HashSet

HHashSet 注:更多詳細方法請自行在 API 上查詢 HashSet 是由hash表(hashMap)支援,不保證元素的迭代順恆久不變,允許存在null值,元素不允許重複,同時,不是執行緒安全的 HashSet是基於HashMap實現的。   &n

基於《仙劍奇俠傳柔情版》利用Java的簡單實現

基於《仙劍奇俠傳柔情版》利用Java的簡單實現(一) 2018-12-01 23:55:36   by Louis  一,新建一個類GameFrame.class,具體程式碼如下: package firstDemo; import javax.swing.JF

檔案讀寫工具簡單實現之java的UI介面視覺化畫圖/製作

現在和大家介紹下,我們簡單的介面工具開發,使用者選擇檔案,讀出部分想要檔案內容,滑鼠在大輸入框點選某一行就會顯示在其他輸入框中,然後在其他輸入框修改後內容,點寫入按鈕即可修改並顯示到大輸入框中,且原檔案對應剛剛選的改行內容;大概的介面如下,網路現在原因不能上傳圖片:選擇檔案按

Java 1.8 HashMap實現譯註

譯者序 作者整個部落格只有這一篇文章,而就這一篇文章,卻是介紹HashMap與Java中Hash策略的精品。作者從Java 2講述到Java 8,細數種種變更,並且用數學公式和清晰的思路解釋其原理。全文行文流暢,排版規範典雅,有著論文般的美感,就技術部落格而言

python3.6簡單爬蟲:獲取電影的爛番茄指數

 載入包import requests from bs4 import BeautifulSoup獲取網站的urlurl = 'https://www.rottentomatoes.com/m/et_the_extraterrestrial' response = reque

簡單的個人銀行管理系統實現

Java的一個實驗內容,修改上學期用C++編寫的個人銀行管理系統。 1、 個人銀行管理系統版本0.1(對應第4章記錄) 1.1 系統需求 設計一個活期儲存賬戶類,包含使用者的賬號、餘額、年利率等資訊,還可以實現顯示賬戶資訊、存款、取款、結算利息的操

USB滑鼠裝置驅動程式簡單實現

一、Linux下的USB驅動程式 分離和分層是Linux下驅動程式開發採用的最基本的形式,USB驅動開發在主機端主要涉及兩個部分:主機控制器驅動和裝置驅動。 主機控制器驅動主要是和具體的Soc相關的,它來識別USB裝置,安裝對應的裝置驅動程式,提供對USB裝置的讀寫函式。