Java中List介紹及常見(jiàn)方法和五種遍歷方式詳解
Java的List介紹
在Java中,List
接口是集合框架的一部分,它定義了一個(gè)有序的集合,允許存儲(chǔ)重復(fù)的元素,并且可以通過(guò)索引訪問(wèn)這些元素。List
繼承自Collection
接口,提供了額外的功能來(lái)處理有序集合。List
的主要特點(diǎn)包括:
- 有序性:存取元素的順序與插入時(shí)的順序一致。
- 可重復(fù)性:允許存儲(chǔ)重復(fù)的元素。
- 索引訪問(wèn):可以通過(guò)整數(shù)索引來(lái)訪問(wèn)和操作元素。
常見(jiàn)的List
實(shí)現(xiàn)類(lèi)有ArrayList
、LinkedList
、Vector
和Stack
等。其中,ArrayList
基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),適合頻繁的隨機(jī)訪問(wèn);而LinkedList
基于雙向鏈表實(shí)現(xiàn),更適合頻繁的插入和刪除操作。
List常見(jiàn)方法
以下是List
接口的一些常用方法及其示例代碼:
添加元素
add(E e)
:向列表末尾添加一個(gè)元素。add(int index, E element)
:在指定位置插入元素,原有元素將向后移動(dòng)。addAll(Collection<? extends E> c)
:將指定集合中的所有元素按順序添加到列表的末尾。addAll(int index, Collection<? extends E> c)
:從指定位置開(kāi)始,將指定集合中的所有元素插入到列表中。
import java.util.ArrayList; import java.util.List; public class ListAddExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add(1, "Orange"); // 在索引1處插入"Orange" System.out.println("After adding elements: " + list); List<String> moreFruits = new ArrayList<>(); moreFruits.add("Grape"); moreFruits.add("Peach"); list.addAll(moreFruits); // 添加到末尾 list.addAll(1, moreFruits); // 從索引1開(kāi)始添加 System.out.println("After adding all elements: " + list); } }
獲取元素
get(int index)
:返回列表中指定位置的元素。indexOf(Object o)
:返回首次出現(xiàn)的指定元素的索引;如果未找到,則返回-1。lastIndexOf(Object o)
:返回最后一次出現(xiàn)的指定元素的索引;如果未找到,則返回-1。
import java.util.ArrayList; import java.util.List; public class ListGetExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); String fruit = list.get(1); // 獲取索引1處的元素 System.out.println("Element at index 1: " + fruit); int index = list.indexOf("Orange"); // 查找"Orange"的索引 System.out.println("Index of 'Orange': " + index); int lastIndex = list.lastIndexOf("Banana"); // 查找最后一個(gè)"Banana"的索引 System.out.println("Last index of 'Banana': " + lastIndex); } }
修改元素
set(int index, E element)
:用指定元素替換列表中指定位置的元素,并返回被替換的元素。
import java.util.ArrayList; import java.util.List; public class ListSetExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); String oldFruit = list.set(1, "Grape"); // 修改索引1處的元素 System.out.println("Replaced element: " + oldFruit); System.out.println("Updated list: " + list); } }
刪除元素
remove(int index)
:移除列表中指定位置的元素,并返回被移除的元素。remove(Object o)
:移除列表中第一次出現(xiàn)的指定元素(僅當(dāng)存在時(shí)),并返回true
,否則返回false
。
import java.util.ArrayList; import java.util.List; public class ListRemoveExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); String removedFruit = list.remove(1); // 移除索引1處的元素 System.out.println("Removed element: " + removedFruit); System.out.println("Updated list: " + list); boolean isRemoved = list.remove("Apple"); // 移除第一個(gè)"Apple" System.out.println("Is 'Apple' removed? " + isRemoved); System.out.println("Final list: " + list); } }
查詢(xún)?cè)?/strong>
contains(Object o)
:如果列表包含指定的元素,則返回true
。isEmpty()
:如果列表不包含任何元素,則返回true
。
import java.util.ArrayList; import java.util.List; public class ListQueryExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); boolean containsBanana = list.contains("Banana"); System.out.println("Does the list contain 'Banana'? " + containsBanana); boolean isEmpty = list.isEmpty(); System.out.println("Is the list empty? " + isEmpty); } }
其他操作
clear()
:從列表中移除所有元素。size()
:返回列表中的元素個(gè)數(shù)。iterator()
:返回一個(gè)迭代器,用于遍歷列表中的元素。listIterator()
:返回一個(gè)ListIterator
,可以雙向遍歷列表,并支持在遍歷過(guò)程中添加或刪除元素。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class ListOtherOperationsExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); System.out.println("List size: " + list.size()); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println("Iterator: " + iterator.next()); } ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) { System.out.println("ListIterator forward: " + listIterator.next()); } while (listIterator.hasPrevious()) { System.out.println("ListIterator backward: " + listIterator.previous()); } list.clear(); // 清空列表 System.out.println("Is the list empty after clearing? " + list.isEmpty()); } }
五種遍歷方式
迭代器(Iterator)
- 使用
Iterator
接口提供的hasNext()
和next()
方法來(lái)遍歷列表。這種方式適用于需要在遍歷過(guò)程中移除元素的情況,因?yàn)?code>Iterator提供了安全地移除元素的能力,避免了ConcurrentModificationException
的風(fēng)險(xiǎn)。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorTraversalExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); System.out.println(item); if ("Banana".equals(item)) { iterator.remove(); // 安全地移除當(dāng)前元素 } } System.out.println("List after removal: " + list); } }
- 使用
增強(qiáng)for循環(huán)(Enhanced for loop)
- 增強(qiáng)for循環(huán)(也稱(chēng)為foreach循環(huán))提供了一種更簡(jiǎn)潔的方式來(lái)遍歷
List
,無(wú)需顯式地管理索引。代碼更加清晰易讀,適合不需要索引信息的場(chǎng)景。
import java.util.ArrayList; import java.util.List; public class EnhancedForLoopTraversalExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); for (String item : list) { System.out.println(item); } } }
- 增強(qiáng)for循環(huán)(也稱(chēng)為foreach循環(huán))提供了一種更簡(jiǎn)潔的方式來(lái)遍歷
普通for循環(huán)
- 使用傳統(tǒng)的for循環(huán)是遍歷
List
最直接的方式之一。這種方式允許你通過(guò)索引訪問(wèn)列表中的元素,適用于需要知道當(dāng)前元素位置或需要根據(jù)索引進(jìn)行操作的情況。
import java.util.ArrayList; import java.util.List; public class ForLoopTraversalExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); for (int i = 0; i < list.size(); i++) { System.out.println("Index " + i + ": " + list.get(i)); } } }
- 使用傳統(tǒng)的for循環(huán)是遍歷
Stream API(Java 8+)
- 自Java 8起引入的
Stream
API為集合操作提供了強(qiáng)大的功能,包括但不限于過(guò)濾、映射、排序等。它允許以聲明式的方式編寫(xiě)復(fù)雜的集合操作邏輯,并且可以輕松地轉(zhuǎn)換成并行流(parallel stream),從而利用多核處理器的優(yōu)勢(shì)加速處理速度。
import java.util.ArrayList; import java.util.List; public class StreamApiTraversalExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); list.stream().forEach(System.out::println); // 單線程遍歷 // 或者使用并行流 // list.parallelStream().forEach(System.out::println); } }
- 自Java 8起引入的
列表迭代器(ListIterator)
ListIterator
是Iterator
的一個(gè)子接口,專(zhuān)門(mén)用于List
集合。它不僅支持雙向遍歷(向前和向后),還可以在遍歷過(guò)程中添加或刪除元素。這使得ListIterator
在某些特定場(chǎng)景下非常有用。
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorTraversalExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Orange"); ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) { String item = listIterator.next(); System.out.println("Forward: " + item); if ("Banana".equals(item)) { listIterator.add("Grape"); // 在當(dāng)前元素后添加新元素 } } System.out.println("List after addition: " + list); while (listIterator.hasPrevious()) { String item = listIterator.previous(); System.out.println("Backward: " + item); if ("Banana".equals(item)) { listIterator.remove(); // 移除當(dāng)前元素 } } System.out.println("List after removal: " + list); } }
總結(jié)
List
接口及其常見(jiàn)實(shí)現(xiàn)類(lèi)如ArrayList
和LinkedList
是Java編程中不可或缺的部分,提供了豐富的API來(lái)處理有序集合。通過(guò)理解List
的特點(diǎn)和常用方法,以及掌握五種遍歷方式,開(kāi)發(fā)者可以根據(jù)具體需求選擇最合適的方式來(lái)操作List
集合。無(wú)論是簡(jiǎn)單的遍歷還是復(fù)雜的集合操作,Java都提供了靈活且高效的解決方案。
到此這篇關(guān)于Java中List介紹及常見(jiàn)方法和五種遍歷方式的文章就介紹到這了,更多相關(guān)Java List常見(jiàn)方法和遍歷方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot @Async如何自定義線程池及使用教程
這篇文章主要介紹了SpringBoot @Async如何自定義線程池及使用教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Spring之ShutDown?Hook死鎖現(xiàn)象解讀
這篇文章主要介紹了Spring之ShutDown?Hook死鎖現(xiàn)象解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04深入解析System.load 與 System.loadLibrary
以下是對(duì)System.load與System.loadLibrary進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過(guò)來(lái)參考下2013-08-08Springboot 如何指定獲取自己寫(xiě)的配置properties文件的值
這篇文章主要介紹了Springboot 如何指定獲取自己寫(xiě)的配置properties文件的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Spring中使用自定義ThreadLocal存儲(chǔ)導(dǎo)致的坑及解決
這篇文章主要介紹了Spring中使用自定義ThreadLocal存儲(chǔ)導(dǎo)致的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java設(shè)計(jì)模式之單例模式實(shí)例分析
這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式,以實(shí)例形式較為詳細(xì)的分析了單例模式的概念、定義及簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11java web實(shí)現(xiàn)簡(jiǎn)單留言板功能
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡(jiǎn)單留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Java Socket循環(huán)接收數(shù)據(jù)readLine()阻塞的解決方案
這篇文章主要介紹了Java Socket循環(huán)接收數(shù)據(jù)readLine()阻塞的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08