Java中為何要使用ArrayList
前言
當我們用於獲取一組資料的時候,我們總是通過下面的格式定義變數。
private List<Tag> tags = new ArrayList<>();
我們熟悉的陣列去哪了?
回顧陣列
我們學習c語言,c++,會學到陣列是儲存同類型的一組資料。後來學習指標,知道了兩種結構,鏈式結構與順序結構。再後來學習資料結構。知道了兩種結構的優缺點。
鏈式結構方便刪除,新增。
順序結構方便查詢。
但是我們在實際使用中逐漸感受到陣列在使用上的缺點。不僅僅是在定義時就要規定陣列大小。
我們通過一個例項來說明
Enemy[] enemys = new Enemy[3]; enemys[0].name = name1; enemys[1].name = name2; enemys[2].name = name3; // 通過名字擊殺對方 public void kill(string name) { for (Enemy enemy : this.enemys) { if (enemy.name === name) { enemy.death(); System.out.println("擊殺成功"); break; } } }
比如我們玩遊戲,現在面前有三個敵人。我們可以通過名字擊殺對方(通過什麼方法擊殺對方並不是我們的重點)。
但是程式碼有一些問題。如果我們總是傳入一個名字,比如name1,此時程式碼總是會顯示擊殺成功,一個敵人只有一條命。現在顯然與實際不符。如何解決呢。
這時我們想到了一個傳統的解決辦法。在enemy類裡增加增加一個Boolean型別屬性alive,預設值為true。此時改寫kill方法程式碼。
public void kill(string name) { for (Enemy enemy : this.enemys) { if (enemy.name === name && enemy.alive === true) { enemy.death(); enemy.alive = false; System.out.println("擊殺成功"); break; } } }
就很好的解決了一個敵人可以被擊殺多次的bug。
但是,問題解決了,還有一些不足。
我們雖然不會顯示一個敵人多次擊殺成功。但是還是要搜尋一遍。有沒有更好的辦法呢。
ArrayList
如果我們能在成功擊殺的時候。能夠將這個敵人移除陣列,並將陣列長度減一。將會變得完美。但是,通過陣列是實現不了的。
這時ArrayList很好的解決了這個問題。
ArrayList並不是一個數組。而是Java函式庫的一個類。我們通過ArrayList來改寫一下我們的程式碼。
ArrayList<Enemy> enemys = new ArrayList<Enemy>(); Enemy enemy1 = new Enemy(); enemy1.name = name1; enemys.add(enemy1); Enemy enemy2 = new Enemy(); enemy2.name = name2; enemys.add(enemy2); Enemy enemy3 = new Enemy(); enemy3.name = name3; enemys.add(enemy3); // 通過名字擊殺對方 public void kill(string name) { for (Enemy enemy : this.enemys) { if (enemy.name === name) { enemy.death(); this.enemys.remove(enemy); System.out.println("擊殺成功"); break; } } }
這時,當我們成功擊殺敵人時,將敵人移除。就會使得下次遍歷時次數變少,並且也避免了重複殺死一個敵人的bug。
List與ArrayList
上邊的程式碼中,我們在定義時是宣告的ArayList變數型別為ArrayList型別
ArrayList<Enemy> enemys = new ArrayList<Enemy>();
但是回到我們的實際專案中為什麼是List型別呢
我們剛才說到ArrayList是一個類。我們看一下ArrayList類的繼承關係
而List是一個介面
public interface List<E> extends Collection<E> { }
所以說ArrayList是List的一個實現類。
而我們在實際專案中寫
List<Subject> usedSubjects = new ArrayList<>();
也就實現了以下格式程式碼
介面 變數名 = new 介面實現類();
能夠實現此寫法的一個原因就是面向物件的三大特點之一——多型。
什麼是多型?
舉個例子,對於以下Dog類
class Animal { } class Gog extends Animal { }
我們在定義物件時總是通過這樣來定義
Dog dog = new Dog();
而多型允許我們可以使用這種方式定義
Animal dog = new Dog ();
多型不僅支援子類與父類之間,也支援介面與他的實現類之間。
那麼這麼寫有什麼好處呢?
List介面有多個實現類,現在你用的是ArrayList,也許哪一天你需要換成其它的實現類,如 LinkedList或者Vector等等,這時你只要改變這一行就行了: List list = new LinkedList(); 其它使用了list地方的程式碼根本不需要改動。
假設你開始用ArrayList alist = new ArrayList(),這下你有的改了,特別是如果你使用了ArrayList實現類特有的方法和屬性。
以上就是Java中為何要使用ArrayList的詳細內容,更多關於Java ArrayList的資料請關注我們其它相關文章!