【威哥說】你們平時使用的數組可能僅僅侷限於固定長度,沒法擴展的,今天波波老師將帶領你們學習一個「會動」的數組。你們一塊兒學習一下他的實現方法吧。java
【廣告】距離磨礪營新班開班僅有20天了。你準備好了嗎?速度搶佔基礎班免費名額吧!數組
【正文】集合的實現原理你有了解麼?今天咱們給你們講一個數據結構,對象數組。你們也知道咱們集合中的list是基於對象數組實現的,那麼對於對象數組的內部管理,也就是俗話說的增刪改查,咱們仍是有必要知道的。數據結構
這裏我們從最基本的定義開始,既然是對象數組,那麼我們數組的類型確定是對象了。此處咱們統一管理Object類型的一個數組。
private Object[] obj;學習
既然建立了對象數組,咱們須要給他進行初始化工做,此處咱們初始化工做經過構造方法,固然經過set方法也是沒問題的。
//初始化時默認給16個長度 public ObjectArray(){ this.obj = new Object[16]; }網站
如上:咱們在構造方法中,給數組進行初始化,初始長度爲16。 那麼聲明好了,初始化完成了,接下來就是管理工做了。首先我們看增長。
一、增長this
首先咱們定一個添加方法:
//添加方法 public void add(Object obj){ }code
寫到這裏,你們想,直接往數組裏面添加東西就好了,來直接添加,哎,一寫的時候發現不是那麼回事啊,往數組裏添加東西得經過下標啊,我這怎麼記錄這當前存放到哪一個位置了呢?哎(此處讀三聲),咱們是否是能夠經過一個外部變量來控制呢,每次存完以後,讓他自增呢?想就作。 首先定義一個成員變量,並將它做爲下標供數組存儲數據:
int count = 0; //添加方法 public void add(Object obj){ objs[count] = obj; count++; }對象
此時咱們看看,count爲0時,存放第一條數據,而後count++變成1,下次在調用add方法時,就存放到1的位置,完美的解決了這個問題。 好的,那接下來下一個問題又產生了,若是我存放的數據不僅16條,那該怎麼辦呢? 思路:咱們都知道定義的數組初始長度爲16,那麼滿十六了就沒有空間供咱們繼續存儲,因此那個時候就須要對數組進行空間的擴充,那如何去判斷是否要擴充數組呢?這裏咱們看一下上面的count,若是存放第一條以後count爲1,添加第二條後,count++變成2,以此類推,count就恰好記錄了當前存放了多少條數據,那麼我們能夠用當前存放的數據條數和總容量進行一下比較:
實現代碼以下: //添加方法 public void add(Object obj){ if (count >= objs.length) { objs = Arrays.copyOf(objs, objs.length*2); } objs[count] = obj; count++; }內存
若是當前實際存放的數量等於原數組的長度,就直接進行擴充,這裏使用到了一個數組操做類Arrays的copyOf(舊的數組,新數組的長度)來完成對數組的擴充。 PS:這裏有一個關於數組擴充的問題:擴充數組時會丟棄舊的數組,從新建立一個新的數組,因此若是擴充次數過多,會形成內存浪費,爲了解決這一點,若是使用者在肯定大體有多少條數據以後,能夠直接給數組指定初始化長度,咱們來提供一個定義長度的初始化構造方法。
//能夠本身指定長度 public ObjectArray(int capacity){ this.objs = new Object[capacity]; }ci
二、修改
針對對象數組的修改,我們有兩種狀況: a)直接修改某個位置的 b)存儲的對象中有惟一標識的屬性,如id,判斷到在哪一個位置,直接去修改的 總結起來,也就是你須要兩個數據:要更新對象的位置;更新的對象,實現代碼以下:
public void update(int index,Object obj){ //這裏須要判斷一下index做爲下標合不合理 if (index<0 || index >= count) { //錯誤提示 }else{ objs[index] = obj; } }
三、刪除
針對數組而言,插入和刪除操做就比較麻煩了,爲何呢,由於咱們要保證數據的有序,因此假如說,我存放了八條數據,我如今想刪除掉第三條,那麼刪除掉以後,還要作收尾工做,得把第四條數據賦值給第三條,而後將第五條的數據賦值給第四條...直到第八條數據賦值給第七條,並將最後一條數據賦值爲空。實現代碼以下:
public void delete(int index){ //判斷下標合法 if (index>=0 && index<count) { //從要刪除的位置起,將以後的數據挨個賦值給前一個數據 //結束位置爲count-1是爲了最後一個數時不越界 for (int i = index; i < count-1; i++) { objs[i] = objs[i+1]; } //完成以後將最後一個位置賦值爲空 objs[count-1] = null; //數據少一個以後count對應的數量也要減去一個 count--; } }
上面是直接根據下標刪除,若是想直接刪除對象,能夠找到該對象對應的下標以後一樣使用根據下標刪除方法:
public void delete(Object obj){ for (int i = 0; i < count; i++) { if (obj.equals(objs[i])) { delete(i); Break; } } }
這裏注意一點,我判斷兩個對象是不是同一個使用equals方法,你們能夠經過重寫hashcode方法和equals方法來自定義兩個對象是否爲同一個對象的標準。另外就是這裏的刪除,由於數組裏能夠存放多個重複元素,也就是說若是有根據對象刪除的話,也只是刪除第一個位置的相同元素。
四、查詢
查詢,這個就直接將數組進行遍歷便可,以下:
public void print(){ for (int i = 0; i < count; i++) { System.out.print(objs[i]+"-->"); } }
這裏,遍歷的最大範圍都是count,由於count纔是真實存在的有效的數據。
這裏咱們記住 數組存儲的優勢:查詢、遍歷 缺點:插入,刪除 使用時,要揚長避短,適合本身的纔是最好的! QQ:曹老師1409615756 威哥公衆號【mjw-java】 官方網站:www.moliying.com 電話直接騷擾:010-56258715
磨礪營java基礎學習1羣 254118709 威哥Android技術交流1羣:227592650 威哥Android技術交流3羣 573068579(直播羣)