簡單ArrayList、LinkedList、HashSet、HashMap實現(一)
面試或筆試中經常遇到像ArrayList和LinkedList以及HashSet和HashMap有什麼區別,或者問你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);
}
}
相關推薦
簡單ArrayList、LinkedList、HashSet、HashMap實現(一)
面試或筆試中經常遇到像ArrayList和LinkedList以及HashSet和HashMap有什麼區別,或者問你HashMap如何實現的。下面我們就自己實現簡單的集合類,完成我們平時經常使用的效果
PHP、MySQL和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#基於TCP、UDP協議的網路通訊實現(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裝置的讀寫函式。