Java LinkedList size() 方法

Java LinkedList Java LinkedList


size() 方法是 Java 中 LinkedList 类提供的一个常用方法,它属于 java.util 包。这个方法的主要作用是返回当前链表中元素的数量。

方法语法

public int size()

返回值

  • 返回 int 类型的值,表示链表中元素的数量
  • 如果链表为空,则返回 0

方法特点

时间复杂度

size() 方法的时间复杂度是 O(1),这意味着无论链表中有多少元素,获取大小的时间都是恒定的。

这是因为 LinkedList 类内部维护了一个 size 变量,在添加或删除元素时会自动更新这个变量,调用 size() 方法时只是简单地返回这个变量的值。

与数组 length 的区别

初学者有时会混淆 size() 方法和数组的 length 属性:

  • 数组的 length 是一个属性,表示数组的容量
  • LinkedListsize() 是一个方法,返回实际存储的元素数量

线程安全性

size() 方法本身不是线程安全的。如果在多线程环境下使用,需要额外的同步措施。


使用示例

基本用法

实例

import java.util.LinkedList;

public class LinkedListSizeDemo {
    public static void main(String[] args) {
        // 创建一个 LinkedList
        LinkedList<String> fruits = new LinkedList<>();
       
        // 添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");
       
        // 使用 size() 方法获取元素数量
        int size = fruits.size();
        System.out.println("LinkedList 中的元素数量: " + size); // 输出: 3
    }
}

空链表的情况

实例

import java.util.LinkedList;

public class EmptyLinkedListDemo {
    public static void main(String[] args) {
        LinkedList<Integer> numbers = new LinkedList<>();
        System.out.println("空链表的 size: " + numbers.size()); // 输出: 0
    }
}

动态变化演示

实例

import java.util.LinkedList;

public class DynamicSizeDemo {
    public static void main(String[] args) {
        LinkedList<Character> letters = new LinkedList<>();
        System.out.println("初始大小: " + letters.size()); // 0
       
        letters.add('A');
        letters.add('B');
        System.out.println("添加两个元素后: " + letters.size()); // 2
       
        letters.removeFirst();
        System.out.println("移除一个元素后: " + letters.size()); // 1
       
        letters.clear();
        System.out.println("清空后: " + letters.size()); // 0
    }
}

常见问题

size() 方法会抛出异常吗?

size() 方法通常不会抛出异常。即使链表为 null(注意不是空链表),调用 size() 方法也不会抛出异常,但会抛出 NullPointerException

实例

LinkedList<String> list = null;
// 下面这行会抛出 NullPointerException
System.out.println(list.size());

size() 和 isEmpty() 的关系

isEmpty() 方法是基于 size() 方法实现的:

实例

public boolean isEmpty() {
    return size() == 0;
}

因此,list.isEmpty() 等价于 list.size() == 0,但前者可读性更好。


实际应用场景

循环遍历

实例

LinkedList<String> colors = new LinkedList<>();
colors.add("Red");
colors.add("Green");
colors.add("Blue");

for (int i = 0; i < colors.size(); i++) {
    System.out.println(colors.get(i));
}

容量检查

实例

LinkedList<Integer> queue = new LinkedList<>();
// ...添加元素...

if (queue.size() > 10) {
    System.out.println("队列已满,无法添加更多元素");
}

与其他集合比较

实例

LinkedList<String> list1 = new LinkedList<>();
LinkedList<String> list2 = new LinkedList<>();

// ...填充两个链表...

if (list1.size() == list2.size()) {
    System.out.println("两个链表大小相同");
}

性能考虑

虽然 size() 方法本身是 O(1) 时间复杂度,但在某些情况下频繁调用 size() 可能会有性能影响:

  1. 多线程环境:每次调用 size() 都需要读取内存中的 size 变量
  2. 复杂循环条件:如 for (int i = 0; i < list.size(); i++),每次循环都会调用 size()

对于第二种情况,可以优化为:

实例

int size = list.size();
for (int i = 0; i < size; i++) {
    // 循环体
}

总结

LinkedListsize() 方法是一个简单但非常重要的方法,它提供了快速获取链表当前元素数量的能力。理解这个方法的工作原理和特点,有助于编写更高效、更可靠的 Java 代码。

记住:

  • size() 返回的是元素数量,不是容量
  • 空链表的 size() 返回 0
  • 在多线程环境下使用时需要注意同步问题
  • 可以结合 isEmpty() 方法使代码更清晰

Java LinkedList Java LinkedList