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的資料請關注好吧啦網其它相關文章!
相關文章:
1. ThinkPHP5 通過ajax插入圖片并實時顯示(完整代碼)2. ASP.NET MVC通過勾選checkbox更改select的內容3. Android實現圖片自動切換功能(實例代碼詳解)4. jsp+mysql實現網頁的分頁查詢5. Python使用oslo.vmware管理ESXI虛擬機的示例參考6. 存儲于xml中需要的HTML轉義代碼7. javascript xml xsl取值及數據修改第1/2頁8. 解決Python paramiko 模塊遠程執行ssh 命令 nohup 不生效的問題9. JavaScript Tab菜單實現過程解析10. 使用AJAX(包含正則表達式)驗證用戶登錄的步驟
