1. 程式人生 > 程式設計 >Java中為何要使用ArrayList

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類的繼承關係

Java中為何要使用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的資料請關注我們其它相關文章!