最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中為何要使用ArrayList

 更新時(shí)間:2020年09月07日 10:26:35   作者:小強(qiáng)Zzz  
這篇文章主要介紹了Java中為何要使用ArrayList,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下

前言

當(dāng)我們用于獲取一組數(shù)據(jù)的時(shí)候,我們總是通過(guò)下面的格式定義變量。

private List<Tag> tags = new ArrayList<>();

我們熟悉的數(shù)組去哪了?

回顧數(shù)組

我們學(xué)習(xí)c語(yǔ)言,c++,會(huì)學(xué)到數(shù)組是存儲(chǔ)同類型的一組數(shù)據(jù)。后來(lái)學(xué)習(xí)指針,知道了兩種結(jié)構(gòu),鏈?zhǔn)浇Y(jié)構(gòu)與順序結(jié)構(gòu)。再后來(lái)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)。知道了兩種結(jié)構(gòu)的優(yōu)缺點(diǎn)。

鏈?zhǔn)浇Y(jié)構(gòu)方便刪除,添加。
順序結(jié)構(gòu)方便查找。

但是我們?cè)趯?shí)際使用中逐漸感受到數(shù)組在使用上的缺點(diǎn)。不僅僅是在定義時(shí)就要規(guī)定數(shù)組大小。

我們通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明

Enemy[] enemys = new Enemy[3];

enemys[0].name = name1;
enemys[1].name = name2;
enemys[2].name = name3;

// 通過(guò)名字擊殺對(duì)方
public void kill(string name) {
  for (Enemy enemy : this.enemys) {
    if (enemy.name === name) {
      enemy.death();
      System.out.println("擊殺成功");
      break;
    }
  }
}

比如我們玩游戲,現(xiàn)在面前有三個(gè)敵人。我們可以通過(guò)名字擊殺對(duì)方(通過(guò)什么方法擊殺對(duì)方并不是我們的重點(diǎn))。
但是代碼有一些問(wèn)題。如果我們總是傳入一個(gè)名字,比如name1,此時(shí)代碼總是會(huì)顯示擊殺成功,一個(gè)敵人只有一條命。現(xiàn)在顯然與實(shí)際不符。如何解決呢。
這時(shí)我們想到了一個(gè)傳統(tǒng)的解決辦法。在enemy類里增加增加一個(gè)Boolean類型屬性alive,默認(rèn)值為true。此時(shí)改寫(xiě)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;
    }
  }
}

就很好的解決了一個(gè)敵人可以被擊殺多次的bug。
但是,問(wèn)題解決了,還有一些不足。

我們雖然不會(huì)顯示一個(gè)敵人多次擊殺成功。但是還是要搜尋一遍。有沒(méi)有更好的辦法呢。

ArrayList

如果我們能在成功擊殺的時(shí)候。能夠?qū)⑦@個(gè)敵人移除數(shù)組,并將數(shù)組長(zhǎng)度減一。將會(huì)變得完美。但是,通過(guò)數(shù)組是實(shí)現(xiàn)不了的。

這時(shí)ArrayList很好的解決了這個(gè)問(wèn)題。

ArrayList并不是一個(gè)數(shù)組。而是Java函數(shù)庫(kù)的一個(gè)類。我們通過(guò)ArrayList來(lái)改寫(xiě)一下我們的代碼。

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);

// 通過(guò)名字擊殺對(duì)方
public void kill(string name) {
  for (Enemy enemy : this.enemys) {
    if (enemy.name === name) {
      enemy.death();
      this.enemys.remove(enemy);
      System.out.println("擊殺成功");
      break;
    }
  }
}

這時(shí),當(dāng)我們成功擊殺敵人時(shí),將敵人移除。就會(huì)使得下次遍歷時(shí)次數(shù)變少,并且也避免了重復(fù)殺死一個(gè)敵人的bug。

List與ArrayList

上邊的代碼中,我們?cè)诙x時(shí)是聲明的ArayList變量類型為ArrayList類型

ArrayList<Enemy> enemys = new ArrayList<Enemy>();

但是回到我們的實(shí)際項(xiàng)目中為什么是List類型呢

我們剛才說(shuō)到ArrayList是一個(gè)類。我們看一下ArrayList類的繼承關(guān)系

而List是一個(gè)接口

public interface List<E> extends Collection<E> {
}

所以說(shuō)ArrayList是List的一個(gè)實(shí)現(xiàn)類。
而我們?cè)趯?shí)際項(xiàng)目中寫(xiě)

List<Subject> usedSubjects = new ArrayList<>();

也就實(shí)現(xiàn)了以下格式代碼

接口 變量名 = new 接口實(shí)現(xiàn)類();

能夠?qū)崿F(xiàn)此寫(xiě)法的一個(gè)原因就是面向?qū)ο蟮娜筇攸c(diǎn)之一——多態(tài)。
什么是多態(tài)?
舉個(gè)例子,對(duì)于以下Dog類

class Animal {
}

class Gog extends Animal {
}

我們?cè)诙x對(duì)象時(shí)總是通過(guò)這樣來(lái)定義

Dog dog = new Dog();

而多態(tài)允許我們可以使用這種方式定義

Animal dog = new Dog ();

多態(tài)不僅支持子類與父類之間,也支持接口與他的實(shí)現(xiàn)類之間。

那么這么寫(xiě)有什么好處呢?

List接口有多個(gè)實(shí)現(xiàn)類,現(xiàn)在你用的是ArrayList,也許哪一天你需要換成其它的實(shí)現(xiàn)類,如 LinkedList或者Vector等等,這時(shí)你只要改變這一行就行了: List list = new LinkedList(); 其它使用了list地方的代碼根本不需要改動(dòng)。

假設(shè)你開(kāi)始用ArrayList alist = new ArrayList(), 這下你有的改了,特別是如果你使用了ArrayList實(shí)現(xiàn)類特有的方法和屬性。

以上就是Java中為何要使用ArrayList的詳細(xì)內(nèi)容,更多關(guān)于Java ArrayList的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 分享一個(gè)安卓的內(nèi)置多種工具類的Activity

    分享一個(gè)安卓的內(nèi)置多種工具類的Activity

    這篇文章主要介紹了分享一個(gè)安卓的內(nèi)置多種工具類的Activity的相關(guān)資料,需要的朋友可以參考下
    2015-04-04
  • Java面向?qū)ο蠡A(chǔ),類,變量,方法

    Java面向?qū)ο蠡A(chǔ),類,變量,方法

    這篇文章主要介紹了Java面向?qū)ο蠡A(chǔ),類,變量,方法,需要的朋友可以參考下
    2020-10-10
  • Java使用NIO優(yōu)化IO實(shí)現(xiàn)文件上傳下載功能

    Java使用NIO優(yōu)化IO實(shí)現(xiàn)文件上傳下載功能

    IO 是基于流來(lái)讀取的,而NIO則是基于塊讀取,面向流 的 I/O 系統(tǒng)一次一個(gè)字節(jié)地處理數(shù)據(jù),這篇文章主要介紹了Java使用NIO優(yōu)化IO實(shí)現(xiàn)文件上傳下載功能,需要的朋友可以參考下
    2022-07-07
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之貪心算法

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之貪心算法

    我們可能在好多地方都會(huì)聽(tīng)到貪心算法這一概念,并且它的算法思想也比較簡(jiǎn)單就是說(shuō)算法只保證局部最優(yōu),進(jìn)而達(dá)到全局最優(yōu)。但我們實(shí)際編程的過(guò)程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問(wèn)題必須滿足貪心選擇性質(zhì)
    2022-02-02
  • Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法

    Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法

    小編最近在改造項(xiàng)目,需要將gateway整合security在一起進(jìn)行認(rèn)證和鑒權(quán),今天小編給大家分享Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法,感興趣的朋友一起看看吧
    2021-06-06
  • SpringMVC文件上傳及查看的示例代碼

    SpringMVC文件上傳及查看的示例代碼

    本篇文章主要介紹了SpringMVC文件上傳及查看的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java使用socket實(shí)現(xiàn)一個(gè)多線程web服務(wù)器的方法

    java使用socket實(shí)現(xiàn)一個(gè)多線程web服務(wù)器的方法

    今天小編就為大家分享一篇java使用socket實(shí)現(xiàn)一個(gè)多線程web服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • java并發(fā)高的情況下用ThreadLocalRandom來(lái)生成隨機(jī)數(shù)

    java并發(fā)高的情況下用ThreadLocalRandom來(lái)生成隨機(jī)數(shù)

    如果我們想要生成一個(gè)隨機(jī)數(shù),通常會(huì)使用Random類。但是在并發(fā)情況下Random生成隨機(jī)數(shù)的性能并不是很理想,本文主要介紹了java并發(fā)高的情況下用ThreadLocalRandom來(lái)生成隨機(jī)數(shù),感興趣的可以了解一下
    2022-05-05
  • 深入jetty的使用詳解

    深入jetty的使用詳解

    本篇文章是對(duì)jetty的使用進(jìn)行了詳細(xì)的分析解釋。需要的朋友參考下
    2013-05-05
  • Java序列化的原理分析及解決

    Java序列化的原理分析及解決

    文章介紹了Java中的序列化機(jī)制,包括Serializable和Externalizable接口的區(qū)別,以及serialVersionUID的作用,Serializable接口可以序列化的所有子類型本身都是可序列化的,如果要序列化的類有父類,父類也應(yīng)該實(shí)現(xiàn)Serializable接口
    2024-11-11

最新評(píng)論

云南省| 名山县| 大埔县| 琼海市| 东海县| 炉霍县| 瓦房店市| 惠水县| 富锦市| 平远县| 富蕴县| 肇庆市| 平乐县| 永顺县| 罗江县| 巴马| 尖扎县| 酒泉市| 潜山县| 灵山县| 建湖县| 大理市| 常山县| 黎城县| 蓝山县| 邢台市| 石渠县| 黑山县| 盐津县| 乐平市| 晋州市| 西充县| 思南县| 赤水市| 祁连县| 宜昌市| 嘉黎县| 井陉县| 安康市| 营口市| 西贡区|