Java中使用ArrayList的10个示例–教程
Java中的ArrayList是HashMap之后最常用的集合類(lèi)。 Java ArrayList表示一個(gè)可自動(dòng)調(diào)整大小的數(shù)組,并用于代替數(shù)組。 由于創(chuàng)建數(shù)組后我們無(wú)法修改數(shù)組的大小,因此我們更喜歡在Java中使用ArrayList,一旦數(shù)組滿了,它就會(huì)自動(dòng)調(diào)整大小。 Java中的ArrayList實(shí)現(xiàn)List接口,并允許null 。 ArrayList還保持元素的插入順序,并允許與不允許重復(fù)的任何Set實(shí)現(xiàn)相反的重復(fù)。
ArrayList同時(shí)支持Iterator和ListIterator進(jìn)行迭代,但建議使用ListIterator因?yàn)樗试S程序員沿任一方向遍歷列表,在迭代過(guò)程中修改列表并獲取Iterator在列表中的當(dāng)前位置。 但是,在使用ListIterator時(shí),您無(wú)需太小心,因?yàn)長(zhǎng)istIterator沒(méi)有當(dāng)前元素; 它的光標(biāo)位置始終位于調(diào)用previous()將返回的元素與調(diào)用next()返回的元素之間。 在本Java ArrayList教程中,我們將了解如何創(chuàng)建Java ArrayList并在Java ArrayList上執(zhí)行各種操作。 在許多Java核心訪談中,諸如ArrayList和Vector之間的差異或LinkedList與ArrayList之類(lèi)的問(wèn)題,該集合類(lèi)也是最受歡迎的。
ArrayList已在Java 5(老虎)中進(jìn)行了修改,以支持泛型 ,這由于增強(qiáng)的類(lèi)型安全性而使Java ArrayList更加強(qiáng)大。 在Java5之前,由于沒(méi)有泛型,因此在編譯時(shí)不進(jìn)行類(lèi)型檢查,這意味著有可能在ArrayList中存儲(chǔ)不同類(lèi)型的元素,該元素用于某些目的,并最終在運(yùn)行時(shí)導(dǎo)致ClassCastException 。
使用泛型,您可以創(chuàng)建Java ArrayList,該Java ArrayList僅接受在創(chuàng)建期間指定的對(duì)象類(lèi)型,如果有人嘗試將其他任何對(duì)象插入Java中的ArrayList,則會(huì)導(dǎo)致編譯錯(cuò)誤。 例如,如果您創(chuàng)建一個(gè)String對(duì)象的ArrayList,則無(wú)法在其上存儲(chǔ)Integer,因?yàn)锳rrayList的add()方法在將對(duì)象添加到Java中的ArrayList中之前會(huì)檢查T(mén)ype,而Java 1.4的add()方法接受任何對(duì)象。
JDK 1.5中帶有泛型的Java ArrayList
同樣重要的是要記住, ArrayList不同步,并且不應(yīng)在多個(gè)線程之間共享。 如果多個(gè)線程同時(shí)訪問(wèn)Java ArrayList實(shí)例,并且至少有一個(gè)線程在結(jié)構(gòu)上修改列表,則必須在外部對(duì)其進(jìn)行同步。 (根據(jù)Java文檔,結(jié)構(gòu)修改是添加或刪除一個(gè)或多個(gè)元素或顯式調(diào)整后備數(shù)組大小的任何操作;僅設(shè)置元素的值不是結(jié)構(gòu)修改。)
通常,通過(guò)在自然封裝列表的某個(gè)對(duì)象上進(jìn)行同步來(lái)完成此操作。 如果不存在這樣的對(duì)象,則應(yīng)使用Collections.synchronizedList()方法“包裝”列表。 建議在創(chuàng)建時(shí)同步列表,以避免意外的對(duì)列表的非同步訪問(wèn)。 另一個(gè)更好的選擇是使用CopyOnWriteArrayList ,它是從Java 5添加的,并針對(duì)多個(gè)并發(fā)讀取進(jìn)行了優(yōu)化。 在
CopyOnWriteArrayList通過(guò)創(chuàng)建基礎(chǔ)數(shù)組的新副本來(lái)實(shí)現(xiàn)所有可變操作(添加,設(shè)置等),這就是為什么將其稱(chēng)為“ CopyOnWrite ”。
Java中的ArrayList示例
讓我們看一些用Java創(chuàng)建ArrayList并使用它們的示例 。 我試圖提供盡可能多的示例,以說(shuō)明Java ArrayList上可能的不同操作。 如果您需要其他Java ArrayList示例,請(qǐng)告訴我,我將在此處添加它們。
Java ArrayList示例1:如何創(chuàng)建ArrayList
您可以在Java中使用帶有或不帶有泛型的ArrayList,因?yàn)樵鰪?qiáng)的類(lèi)型安全性,建議使用泛型版本都允許。
在此示例中,我們將創(chuàng)建一個(gè)String的ArrayList。 如果我們嘗試除String之外的任何其他對(duì)象,則此ArrayList將僅允許String并將引發(fā)編譯錯(cuò)誤。 如果您發(fā)現(xiàn)需要在表達(dá)式的右側(cè)和左側(cè)指定類(lèi)型,那么從Java 1.7開(kāi)始,如果使用菱形運(yùn)算符(尖括號(hào)),則只需要在左側(cè)指定即可。 如果您定義嵌套類(lèi)型的ArrayList,則可以節(jié)省大量空間。
ArrayList<String> stringList = new ArrayList<String> ; // Generic ArrayList to store only String ArrayList<String> stringList = new ArrayList<>(); // Using Diamond operator from Java 1.7Java ArrayList示例2:如何將元素添加到ArrayList中
您可以通過(guò)調(diào)用add()方法將元素添加到ArrayList中。 由于我們使用的是泛型,并且這是String的ArrayList,因此第二行將導(dǎo)致編譯錯(cuò)誤,因?yàn)榇薃rrayList僅允許使用String元素。
stringList.add("Item"); //no error because we are storing String stringList.add(new Integer(2)); //compilation errorJava ArrayList示例3:如何查找ArrayList的大小
Java中ArrayList的大小是當(dāng)前存儲(chǔ)在ArrayList中的元素總數(shù)。 您可以通過(guò)在其上調(diào)用size()方法輕松地在ArrayList中找到許多元素。 請(qǐng)記住,這可能與支持ArrayList的數(shù)組的長(zhǎng)度不同。 實(shí)際上,后備數(shù)組的長(zhǎng)度總是大于ArrayList的大小,以便它可以存儲(chǔ)更多元素。
int size = stringList.size();Java ArrayList示例4:檢查Java ArrayList中項(xiàng)目的索引
您可以使用ArrayList the indexOf()方法來(lái)查找特定對(duì)象的索引。 使用此方法時(shí),ArrayList在內(nèi)部使用equals()方法查找對(duì)象,因此請(qǐng)確保您的元素實(shí)現(xiàn)equals()
和hashCode()或Object類(lèi)的默認(rèn)實(shí)現(xiàn),將使用基于內(nèi)存位置的對(duì)象進(jìn)行比較。
如何在循環(huán)中從ArrayList檢索元素
很多時(shí)候,我們需要遍歷ArrayList并對(duì)每個(gè)檢索到的項(xiàng)目執(zhí)行一些操作。 這是不使用Iterator的兩種方法。 我們將在下一節(jié)中看到Iterator的用法。
for (int i = 0; i < stringList.size(); i++)String item = stringList.get(i);System.out.println("Item " + i + " : " + item); }From Java5 onwards you can use foreach loop as wellfor(String item: stringList){ System.out.println("retrieved element: " + item); }如何在ArrayList中搜索元素?
有時(shí)我們需要檢查Java的ArrayList中是否存在某個(gè)元素,為此,我們可以使用Java的contains()方法。 contains()方法采用ArrayList創(chuàng)建中定義的對(duì)象類(lèi)型,如果此列表包含指定的元素,則返回true。 或者,您也可以使用Collections.binarySearch()方法查看List中是否存在對(duì)象。 ArrayList , Vector , CopyOnWriteArrayList和Stack implements RandomAccess接口,它們可用于執(zhí)行二進(jìn)制搜索。 要了解哪種方法比較好,看到這個(gè)文章。
如何在Java中檢查ArrayList是否為空
我們可以使用ArrayList的isEmpty()方法檢查它是否為空。 如果此ArrayList不包含任何元素,則isEmpty()方法返回true。 您還可以使用List的size()方法檢查L(zhǎng)ist是否為空。 如果返回的大小為零,則ArrayList為空。
boolean result = stringList.isEmpty(); //isEmpty() will return true if List is emptyif(stringList.size() == 0){System.out.println("ArrayList is empty"); }如何從ArrayList中刪除元素
有兩種方法可以從Java中的ArrayList中刪除任何元素 。 您可以根據(jù)元素的索引或提供對(duì)象本身來(lái)刪除它。 Remove remove (int索引)和remove(Object o)方法用于從Java中的ArrayList中刪除任何元素。 由于ArrayList允許重復(fù),因此值得注意的是remove(Object o)從此列表中刪除指定元素的首次出現(xiàn)(如果存在)。 在下面的代碼中,第一次調(diào)用將從ArrayList中刪除第一個(gè)元素,而第二次調(diào)用將從Java中的ArrayList中刪除第一次出現(xiàn)的項(xiàng)。
stringList.remove(0); stringList.remove(item);有關(guān)從ArrayList刪除元素的正確方法的詳細(xì)討論,請(qǐng)查看本教程 。
將數(shù)據(jù)從一個(gè)ArrayList復(fù)制到另一個(gè)ArrayList
為此,您需要多次創(chuàng)建ArrayList的副本,可以使用addAll(Collection c)
Java中ArrayList的方法,用于將ArrayList上的所有元素復(fù)制到另一個(gè)ArrayList。 下面的代碼會(huì)將stringList所有元素添加到新創(chuàng)建的copyOfStringList 。
如何替換ArrayList中特定索引處的元素?
您可以使用Java ArrayList的set ( int index , E element )方法來(lái)替換特定索引中的任何元素。 下面的代碼將把stringList的第一個(gè)元素從“ Item ” stringList為“ Item Item2 ”。
stringList.set(0,"Item2");如何從ArrayList中刪除所有元素?
Java中的ArrayList提供了clear()方法,該方法從此列表中刪除所有元素。 下面的代碼將從我們的stringList所有元素,并使列表為空。 您可以在清除后重新使用Java ArrayList 。
stingList.clear();如何在Java中從ArrayList轉(zhuǎn)換為Array
ArrayList為您提供了從ArrayList取回陣列的便利 。 您可以使用toArray(T[] a)方法以適當(dāng)?shù)捻樞?#xff08;從第一個(gè)到最后一個(gè)元素)返回一個(gè)包含此列表中所有元素的數(shù)組。 “ a ”是要存儲(chǔ)列表元素的數(shù)組(如果足夠大的話); 否則,將為此分配一個(gè)具有相同運(yùn)行時(shí)類(lèi)型的新數(shù)組。
String[] itemArray = new String[stringList.size()]; String[] returnedArray = stringList.toArray(itemArray);如果您想將ArrayList轉(zhuǎn)換回Array,請(qǐng)參見(jiàn)用Java 將數(shù)組轉(zhuǎn)換為ArrayList的3種方法
如何在Java中同步ArrayList?
有時(shí),您需要在Java中同步ArrayList以使其在多個(gè)線程之間可共享,您可以為此使用Collections實(shí)用程序類(lèi),如下所示。
List list = Collections.synchronizedList(new ArrayList(...));盡管也有其他選擇,例如,如果您需要同步列表,那么您也可以使用CopyOnWriteArrayList ,它是Java 1.5上添加的并發(fā)列表,并且在讀取性能方面優(yōu)于同步ArayList。 您還可以查看本教程,以了解有關(guān)如何在Java中同步ArrayList的更多信息?
如何在Java中從Array創(chuàng)建ArrayList?
Java中的ArrayList令人驚奇,您甚至可以從已經(jīng)存在的數(shù)組中創(chuàng)建一個(gè)充滿元素的ArrayList。 為此,您需要使用Arrays.asList(T... a)方法,該方法返回由指定數(shù)組支持的固定大小的列表。
ArrayList stringList = Arrays.asList(new String[]{"One", "Two", "Three"); //this is not read only List you can still update value of existing elements如何在Java中循環(huán)遍歷ArrayList?
您可以使用Iterator或ListIterator 在ArrayList上遍歷 。 ListIterator允許您在兩個(gè)方向上遍歷,而Iterator和ListIterator都允許您在遍歷時(shí)從Java中的ArrayList中刪除元素 。
Iterator itr = stringList.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); }ListIterator listItr = stringList.listIterator(); while(listItr.hasNext()){ System.out.println(itr.next()); }請(qǐng)參閱如何在Java中循環(huán)ArrayList,以了解在Java中遍歷列表的其他兩種方法。
如何在Java中對(duì)ArrayList進(jìn)行排序?
您可以使用
Collections.sort(List list)方法可以按Comparable接口定義的自然順序?qū)ava ArrayList進(jìn)行排序,并且可以使用Collections.sort(List list, Comparator c)方法根據(jù)自定義Comparator對(duì)Java ArrayList進(jìn)行排序。 您還可以查看此帖子, 以在Java中按降序?qū)rrayList進(jìn)行排序
如何在Java中將ArrayList轉(zhuǎn)換為HashSet
大多數(shù)Collection類(lèi)都提供一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)接受Collection對(duì)象作為參數(shù)。 哪個(gè)可用于將一個(gè)集合的所有元素復(fù)制到另一個(gè)? HashSet還提供了可用于將所有對(duì)象從ArrayList復(fù)制到HashSet此類(lèi)構(gòu)造函數(shù)。 但是要小心,因?yàn)镠ashSet不允許重復(fù),某些對(duì)象將不被包括在內(nèi),從而導(dǎo)致對(duì)象數(shù)量減少。 有關(guān)分步示例,請(qǐng)參見(jiàn)如何在Java中將ArrayList轉(zhuǎn)換為HashSet 。
有關(guān)Java中ArrayList的提示
有資格使用Java進(jìn)行垃圾收集 ,
前提是不再存在針對(duì)這些對(duì)象的強(qiáng)大參考。
何時(shí)在Java中使用ArrayList
現(xiàn)在,您知道什么是ArrayList,此類(lèi)的不同方法以及其工作方式。 現(xiàn)在是時(shí)候?qū)W習(xí)何時(shí)使用ArrayList了。 對(duì)于Java程序員來(lái)說(shuō),了解Collection類(lèi)非常重要,同樣重要的是開(kāi)發(fā)決定在特定情況下使用哪個(gè)collection的能力。 大多數(shù)時(shí)候,兩個(gè)因素決定著您的決策,性能和功能。
ArrayList是基于索引的數(shù)據(jù)結(jié)構(gòu),這意味著如果您知道索引,它就可以提供O(1)搜索性能;類(lèi)似地,在最佳情況下向ArrayList中添加元素也是O(1)性能,但是如果添加會(huì)觸發(fā)列表大小的調(diào)整,則它將在O(n)級(jí)別上,因?yàn)閷⒒ㄙM(fèi)大量時(shí)間將舊列表的元素復(fù)制到新的ArrayList中。 回到功能上,如果您適合使用重復(fù)的元素,則僅使用此集合類(lèi)。 它不是線程安全的,所以不要在并發(fā)環(huán)境中使用它。
翻譯自: https://www.javacodegeeks.com/2016/01/10-examples-using-arraylist-java-tutorial.html
總結(jié)
以上是生活随笔為你收集整理的Java中使用ArrayList的10个示例–教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓云模拟器网页版(安卓云模拟器)
- 下一篇: 促销活动备案部门(促销活动备案)