Java LinkedList size() 方法
size()
方法是 Java 中 LinkedList
类提供的一个常用方法,它属于 java.util
包。这个方法的主要作用是返回当前链表中元素的数量。
方法语法:
public int size()
返回值:
- 返回
int
类型的值,表示链表中元素的数量 - 如果链表为空,则返回 0
方法特点
时间复杂度
size()
方法的时间复杂度是 O(1),这意味着无论链表中有多少元素,获取大小的时间都是恒定的。
这是因为 LinkedList
类内部维护了一个 size
变量,在添加或删除元素时会自动更新这个变量,调用 size()
方法时只是简单地返回这个变量的值。
与数组 length 的区别
初学者有时会混淆 size()
方法和数组的 length
属性:
- 数组的
length
是一个属性,表示数组的容量 LinkedList
的size()
是一个方法,返回实际存储的元素数量
线程安全性
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
}
}
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
}
}
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
}
}
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());
// 下面这行会抛出 NullPointerException
System.out.println(list.size());
size() 和 isEmpty() 的关系
isEmpty()
方法是基于 size()
方法实现的:
实例
public boolean isEmpty() {
return size() == 0;
}
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));
}
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("队列已满,无法添加更多元素");
}
// ...添加元素...
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("两个链表大小相同");
}
LinkedList<String> list2 = new LinkedList<>();
// ...填充两个链表...
if (list1.size() == list2.size()) {
System.out.println("两个链表大小相同");
}
性能考虑
虽然 size()
方法本身是 O(1) 时间复杂度,但在某些情况下频繁调用 size()
可能会有性能影响:
- 多线程环境:每次调用
size()
都需要读取内存中的size
变量 - 复杂循环条件:如
for (int i = 0; i < list.size(); i++)
,每次循环都会调用size()
对于第二种情况,可以优化为:
实例
int size = list.size();
for (int i = 0; i < size; i++) {
// 循环体
}
for (int i = 0; i < size; i++) {
// 循环体
}
总结
LinkedList
的 size()
方法是一个简单但非常重要的方法,它提供了快速获取链表当前元素数量的能力。理解这个方法的工作原理和特点,有助于编写更高效、更可靠的 Java 代码。
记住:
size()
返回的是元素数量,不是容量- 空链表的
size()
返回 0 - 在多线程环境下使用时需要注意同步问题
- 可以结合
isEmpty()
方法使代码更清晰
点我分享笔记