Java List 详解

Java List详解

Java中的List是Java集合框架(Java Collections Framework)的一部分,它表示一个有序的集合(也称为序列)。与Set不同,List允许存储重复的元素,并且每个元素都有其特定的位置。List接口在java.util包中定义,是Collection接口的子接口。

List的主要特点:

  • 有序性:List中的元素是有序的,可以通过索引(位置)来访问元素。
  • 可重复性:List允许存储重复的元素。
  • 动态性:List的大小是可变的,可以在运行时添加或删除元素。

List的常用实现类:

  • ArrayList:基于动态数组实现的List,随机访问元素速度快,但在列表中间插入或删除元素时性能较差。
  • LinkedList:基于链表实现的List,在列表中间插入或删除元素时性能较好,但随机访问元素速度较慢。
  • Vector:是线程安全的ArrayList,但性能较低,通常不推荐使用,除非需要线程安全。
  • Stack:继承自Vector,实现了一个后进先出(LIFO)的栈结构。

List的常用方法:

添加元素:

boolean add(E e):将指定的元素添加到此列表的末尾。

void add(int index, E element):在此列表中的指定位置插入指定的元素。

boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到此列表的末尾。

boolean addAll(int index, Collection<? extends E> c):从指定的位置开始,将指定集合中的所有元素插入到此列表中。

删除元素:

  • boolean remove(Object o):从此列表中移除指定元素的第一个匹配项(如果存在)。
  • E remove(int index):移除列表中指定位置的元素。
  • boolean removeAll(Collection<?> c):从此列表中移除指定集合中包含的所有元素。
  • boolean retainAll(Collection<?> c):仅保留此列表中那些也包含在指定集合中的元素。
  • void clear():移除此列表中的所有元素。

获取元素:

  • E get(int index):返回列表中指定位置的元素。
  • int indexOf(Object o):返回此列表中首次出现指定元素的索引;如果此列表不包含元素,则返回 -1。
  • int lastIndexOf(Object o):返回此列表中最后出现指定元素的索引;如果此列表不包含元素,则返回 -1。
  • List subList(int fromIndex, int toIndex):返回列表中指定的 fromIndex(包括)和
    toIndex(不包括)之间的部分视图。

其他常用方法:

  • boolean isEmpty():如果此列表不包含元素,则返回 true。
  • int size():返回此列表中的元素数。
  • boolean contains(Object o):如果此列表包含指定的元素,则返回 true。
  • Iterator iterator():返回按适当顺序在此列表的元素上进行迭代的迭代器。
  • List sort(Comparator<? super E> c):根据指定的比较器对此列表进行排序。

使用示例:

java 复制代码
import java.util.ArrayList;  
import java.util.List;  
  
public class ListExample {  
    public static void main(String[] args) {  
        List<String> list = new ArrayList<>();  
          
        // 添加元素  
        list.add("Apple");  
        list.add("Banana");  
        list.add("Cherry");  
          
        // 访问元素  
        System.out.println(list.get(1)); // 输出: Banana  
          
        // 修改元素  
        list.set(1, "Blueberry");  
        System.out.println(list.get(1)); // 输出: Blueberry  
          
        // 删除元素  
        list.remove("Cherry");  
        System.out.println(list); // 输出: [Apple, Blueberry]  
          
        // 遍历元素  
        for (String fruit : list) {  
            System.out.println(fruit);  
        }  
          
        // 检查元素是否存在  
        System.out.println(list.contains("Apple")); // 输出: true  
          
        // 获取列表大小
        System.out.println(list.size()); // 输出: 2
        // 对列表进行排序(假设元素实现了Comparable接口)  
    List<Integer> numbers = new ArrayList<>();  
    numbers.add(3);  
    numbers.add(1);  
    numbers.add(2);  
    numbers.sort(null); // 使用自然顺序排序  
    System.out.println(numbers); // 输出: [1, 2, 3]  

    // 使用子列表  
    List<String> subList = list.subList(0, 1); // 获取从索引0到索引1(不包括)的子列表  
    System.out.println(subList); // 输出: [Apple]  
}

性能考虑:

选择哪种List实现取决于具体的使用场景。如果需要频繁地在列表中间进行插入或删除操作,LinkedList可能是更好的选择。如果需要频繁地访问列表中的元素(例如通过索引访问),那么ArrayList可能更合适。然而,在大多数情况下,ArrayList的性能表现通常优于LinkedList,特别是在处理大量数据时。因此,除非有特定的性能需求,否则ArrayList通常是更好的默认选择。

线程安全:

List接口本身并不保证线程安全。如果多个线程同时修改List,可能会导致数据不一致或其他并发问题。如果需要线程安全的List,可以使用Collections.synchronizedList()方法包装一个List,或者使用CopyOnWriteArrayList等线程安全的List实现类。

总结:

Java的List是一个功能强大的集合类型,它提供了许多用于操作有序元素集合的方法。选择正确的List实现类以及正确地使用这些方法对于编写高效且可靠的Java代码至关重要。通过理解List的主要特点、常用实现类、常用方法以及性能考虑,可以更好地利用Java的集合框架来构建复杂的数据结构和算法。

相关推荐
xlsw_8 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹1 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭1 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
李小白662 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp2 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb