List工具类详解

本文详细介绍了Java中的List工具类,包括Collections、Arrays、Guava和Apache Commons Collections等,提供了各种方法的示例,如排序、查找、筛选等操作,帮助开发者更高效地操作List。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List工具类

List 工具类是 Java 中一个常用的工具类,它提供了一系列用于操作 List 的静态方法。在开发中,经常需要对 List 进行排序、查找、筛选等操作,使用 List 工具类可以让这些操作更加方便和高效。

Collections工具类

Collections是Java提供的一个工具类,主要用于操作集合类数据,提供了一系列静态方法,方便对集合进行排序、查找、替换等操作。

Collections工具类的常用方法
方法名功能
sort(List list)对List进行自然排序
sort(List list, Comparator<? super T> c)根据指定比较器对List进行排序
binarySearch(List<?> list, Object key)在已排序的List中查找指定元素
reverse(List<?> list)反转List中的元素顺序
shuffle(List<?> list)随机打乱List中的元素顺序
max(Collection<? extends T> coll)返回Collection中的最大元素
min(Collection<? extends T> coll)返回Collection中的最小元素
addAll(Collection<? super T> c, T… elements)将多个元素添加到指定Collection中
frequency(Collection<?> c, Object o)返回指定元素在Collection中出现的次数
isEmpty(Collection<?> c)判断Collection是否为空
unmodifiableCollection(Collection<? extends T> c)返回一个不可修改的Collection
synchronizedCollection(Collection c)返回一个线程安全的Collection
disjoint(Collection<?> c1, Collection<?> c2)判断两个集合是否没有交集。
copy(List<? super T> dest, List<? extends T> src)将src中的所有元素复制到dest中。
fill(List<? super T> list, T obj)用指定元素obj替换List中的所有元素。
swap(List<?> list, int i, int j)交换List中指定位置的两个元素。
示例代码
Collections工具类常用方法的示例
import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        // sort(List<T> list)
        List<String> strings = new ArrayList<>(Arrays.asList("banana", "apple", "orange", "pear"));
        Collections.sort(strings);
        System.out.println(strings); // [apple, banana, orange, pear]

        // sort(List<T> list, Comparator<? super T> c)
        List<Integer> integers = new ArrayList<>(Arrays.asList(4, 2, 3, 1));
        Comparator<Integer> reverseComparator = Collections.reverseOrder();
        Collections.sort(integers, reverseComparator);
        System.out.println(integers); // [4, 3, 2, 1]

        // binarySearch(List<? extends Comparable<? super T>> list, T key)
        List<String> sortedStrings = new ArrayList<>(Arrays.asList("apple", "banana", "orange", "pear"));
        int index = Collections.binarySearch(sortedStrings, "banana");
        System.out.println(index); // 1

        // binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
        List<Integer> sortedIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        Comparator<Integer> descendingComparator = Collections.reverseOrder();
        int index2 = Collections.binarySearch(sortedIntegers, 3, descendingComparator);
        System.out.println(index2); // 1

        // shuffle(List<?> list)
        List<Character> characters = new ArrayList<>(Arrays.asList('a', 'b', 'c', 'd'));
        Collections.shuffle(characters);
        System.out.println(characters); // [b, a, c, d]

        // reverse(List<?> list)
        List<String> reverseStrings = new ArrayList<>(Arrays.asList("apple", "banana", "orange", "pear"));
        Collections.reverse(reverseStrings);
        System.out.println(reverseStrings); // [pear, orange, banana, apple]

        // swap(List<?> list, int i, int j)
        List<Integer> swapIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        Collections.swap(swapIntegers, 1, 3);
        System.out.println(swapIntegers); // [1, 4, 3, 2]

        // fill(List<? super T> list, T obj)
        List<Integer> fillIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        Collections.fill(fillIntegers, 0);
        System.out.println(fillIntegers); // [0, 0, 0, 0]

        // copy(List<? super T> dest, List<? extends T> src)
        List<Integer> sourceIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        List<Integer> destIntegers = new ArrayList<>(Arrays.asList(0, 0, 0, 0));
        Collections.copy(destIntegers, sourceIntegers);
        System.out.println(destIntegers); // [1, 2, 3, 4]

        // max(Collection<? extends T> coll)
        List<Integer> maxIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        Integer max = Collections.max(maxIntegers);
        System.out.println(max); // 4

        // min(Collection<? extends T> coll)
        List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6);
        Integer min = Collections.min(maxIntegers);
        System.out.println(max);

        // frequency(Collection<?> c, Object o)
        List<Integer> freqnum = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);
        int freq = Collections.frequency(numbers, 5);
        System.out.println(freq); // Output: 3

        // disjoint(Collection<?> c1, Collection<?> c2)
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(6, 7, 8, 9, 10);
        boolean disjoint1 = Collections.disjoint(list1, list2);
        System.out.println(disjoint1); // Output: true

        List<String> list3 = Arrays.asList("apple", "banana", "cat");
        List<String> list4 = Arrays.asList("dog", "elephant", "fish");
        boolean disjoint2 = Collections.disjoint(list3, list4);
        System.out.println(disjoint2); // Output: true
    }
}
使用不可变的列表示例代码
import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        // 创建一个包含若干元素的不可变列表
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        // 使用 Collections.unmodifiableList() 方法包装该列表,返回不可修改的列表视图
        List<Integer> unmodifiableList = Collections.unmodifiableList(numbers);
        System.out.println("不可修改的列表视图:");
        System.out.println(unmodifiableList);

        // 尝试修改该列表,会抛出 UnsupportedOperationException 异常
        try {
            unmodifiableList.set(0, 0);
        } catch (UnsupportedOperationException e) {
            System.out.println("修改不可修改的列表视图会抛出 UnsupportedOperationException 异常");
        }

        // 创建一个线程安全的列表
        List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
        // 对该列表进行操作时,会获得锁,保证线程安全
        synchronized (synchronizedList) {
            synchronizedList.add(1);
            synchronizedList.add(2);
            synchronizedList.add(3);
        }

        // 使用 Collections.newSetFromMap() 方法创建一个线程安全的集合
        Set<Integer> synchronizedSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
        // 对该集合进行操作时,会获得锁,保证线程安全
        synchronized (synchronizedSet) {
            synchronizedSet.add(1);
            synchronizedSet.add(2);
            synchronizedSet.add(3);
        }

        // 创建一个只读的空列表
        List<Integer> emptyList = Collections.emptyList();
        System.out.println("只读的空列表:");
        System.out.println(emptyList);

        // 创建一个只读的空集合
        Set<Integer> emptySet = Collections.emptySet();
        System.out.println("只读的空集合:");
        System.out.println(emptySet);

        // 创建一个只读的空映射
        Map<Integer, String> emptyMap = Collections.emptyMap();
        System.out.println("只读的空映射:");
        System.out.println(emptyMap);
    }
}

定义了一个名为 result 的变量,并用 Collections.emptyList() 方法将其初始化为一个空的不可变的列表。Collections.emptyList() 方法返回一个空列表的不可变视图,该视图不允许进行添加或删除操作,但可以进行读取操作。此处使用不可变的空列表可以减少内存使用和提高性能,因为它们不需要分配额外的内存来存储元素。

Arrays工具类

Java提供的一个数组工具类,包含了许多静态方法,可以将数组转换成List、将List转换成数组、排序等操作。

Arrays工具类常用方法
方法描述
Arrays.sort(array)对数组进行排序。
Arrays.binarySearch(array, key)在有序数组中查找指定元素。
Arrays.copyOf(array, length)复制指定数组,截取或填充空缺部分。
Arrays.fill(array, value)将指定值填充到数组中的每个元素。
Arrays.equals(array1, array2)比较两个数组是否相等。
Arrays.toString(array)将数组转换为字符串输出。
示例代码
常用方法的示例代码
import java.util.Arrays;

public class ArraysExample {
    public static void main(String[] args) {
        int[] numbers = {5, 1, 3, 2, 4};

        // 排序
        Arrays.sort(numbers);
        System.out.println("排序后的数组:" + Arrays.toString(numbers));

        // 查找元素
        int index = Arrays.binarySearch(numbers, 3);
        System.out.println("元素 3 的索引为:" + index);

        // 复制数组
        int[] copyNumbers = Arrays.copyOf(numbers, 3);
        System.out.println("截取前三个元素后的数组:" + Arrays.toString(copyNumbers));

        // 填充数组
        Arrays.fill(numbers, 0);
        System.out.println("填充后的数组:" + Arrays.toString(numbers));

        // 比较数组
        int[] anotherNumbers = {5, 1, 3, 2, 4};
        boolean isEqual = Arrays.equals(numbers, anotherNumbers);
        System.out.println("两个数组是否相等:" + isEqual);

        // 数组转字符串
        String numbersStr = Arrays.toString(numbers);
        System.out.println("数组转换为字符串:" + numbersStr);
    }
}
使用Arrays工具类进行数组操作
import java.util.Arrays;

public class ArraysExample {
    public static void main(String[] args) {
        // 创建一个长度为10的随机整数数组
        int[] array = new int[10];
        for (int i = 0; i < array.length; i++) {
            array[i] = (int) (Math.random() * 100);
        }
        System.out.println("随机数组:" + Arrays.toString(array));

        // 对数组进行排序
        Arrays.sort(array);
        System.out.println("排序后的数组:" + Arrays.toString(array));

        // 查找指定元素在数组中的索引
        int key = 50;
        int index = Arrays.binarySearch(array, key);
        if (index < 0) {
            System.out.println(key + "不在数组中");
        } else {
            System.out.println(key + "在数组中的索引为:" + index);
        }

        // 复制数组,截取或填充空缺部分
        int[] copy1 = Arrays.copyOf(array, 5);
        System.out.println("复制数组前5个元素:" + Arrays.toString(copy1));
        int[] copy2 = Arrays.copyOf(array, 15);
        System.out.println("复制数组并填充空缺部分:" + Arrays.toString(copy2));

        // 填充数组中的每个元素
        int[] filled = new int[5];
        Arrays.fill(filled, 10);
        System.out.println("填充后的数组:" + Arrays.toString(filled));

        // 比较两个数组是否相等
        int[] array1 = {1, 2, 3};
        int[] array2 = {1, 2, 3};
        int[] array3 = {1, 3, 2};
        System.out.println("数组1和数组2是否相等:" + Arrays.equals(array1, array2));
        System.out.println("数组1和数组3是否相等:" + Arrays.equals(array1, array3));

        // 将数组转换成字符串输出
        System.out.println("数组转换成字符串:" + Arrays.toString(array));
    }
}
Guava工具类

Java工具库,提供了许多实用的工具类和数据类型,包括集合、缓存、并发、字符串处理、IO等等

Guava工具类常用方法
方法描述
Joiner提供了各种方式将字符串拼接起来。
Splitter用于将字符串拆分成不同的部分。
CharMatcher提供了各种字符匹配器,用于在字符串中查找或过滤字符。
CaseFormat用于格式化不同大小写的字符串。
Ordering提供了各种排序器,用于对集合中的元素进行排序。
Iterables提供了各种操作集合的方法,如过滤、转换等。
Lists提供了各种操作列表的方法,如反转、分区等。
Maps提供了各种操作映射的方法,如过滤、转换等。
Sets提供了各种操作集合的方法,如交集、差集等。
Multisets提供了各种操作可重复集合的方法,如计数、去重等。
Cache提供了缓存实现的类。
EventBus提供了事件总线的实现。
Lists工具类
  • Lists.newArrayList(E… elements):创建一个包含指定元素的ArrayList实例。
mathematicaCopy code
List<String> list = Lists.newArrayList("apple", "banana", "orange");
  • Lists.partition(List list, int size):将一个列表分成指定大小的多个子列表。
luaCopy codeList<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> partitionedList = Lists.partition(list, 3);
System.out.println(partitionedList); // [[1, 2, 3], [4, 5, 6], [7]]
Maps工具类
  • Maps.newHashMap():创建一个HashMap实例。
arduinoCopy codeMap<String, Integer> map = Maps.newHashMap();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
System.out.println(map); // {apple=1, banana=2, orange=3}
  • Maps.uniqueIndex(Iterable values, Function<? super T,K> keyFunction):将一个集合转换为Map,key为指定的属性,value为集合中的元素。
perlCopy codeList<Student> students = Lists.newArrayList(
        new Student("Tom", "Male"),
        new Student("Jerry", "Male"),
        new Student("Lucy", "Female")
);
Map<String, Student> map = Maps.uniqueIndex(students, Student::getName);
System.out.println(map); // {Tom=Student{name='Tom', gender='Male'}, Jerry=Student{name='Jerry', gender='Male'}, Lucy=Student{name='Lucy', gender='Female'}}
Strings工具类
  • Strings.isNullOrEmpty(String str):判断一个字符串是否为空或null。
csharpCopy codeString str1 = "";
String str2 = null;
System.out.println(Strings.isNullOrEmpty(str1)); // true
System.out.println(Strings.isNullOrEmpty(str2)); // true
  • Strings.padStart(String str, int minLength, char padChar):将一个字符串填充到指定长度,如果不足则在前面填充指定字符。
rustCopy codeString str = "123";
String paddedStr = Strings.padStart(str, 5, '0');
System.out.println(paddedStr); // 00123
Files工具类
  • Files.write(byte[] bytes, File file):将字节数组写入文件中。
arduinoCopy codebyte[] data = "Hello, world!".getBytes();
File file = new File("hello.txt");
Files.write(data, file);
  • Files.readLines(File file, Charset charset):读取文件中的所有行,返回一个List。
arduinoCopy codeFile file = new File("hello.txt");
List<String> lines = Files.readLines(file, Charsets.UTF_8);
System.out.println(lines); // [Hello, world!]

以上只是Guava工具类的一部分,Guava提供了许多其他实用的工具类和数据类型,可以根据具体需求查阅Guava官方文档。

Apache Commons Collections工具类

一个集合工具类,包含了许多静态方法,可以对List进行排序、查找、替换、反转、打乱等操作。

Apache Commons Collections工具类常用方法
工具类方法描述
CollectionUtilsunion(collection1, collection2)返回两个集合的并集
CollectionUtilsintersection(collection1, collection2)返回两个集合的交集
CollectionUtilssubtract(collection1, collection2)返回集合1中有,但集合2中没有的元素集合
CollectionUtilsisEmpty(collection)判断集合是否为空
CollectionUtilsisNotEmpty(collection)判断集合是否非空
CollectionUtilsselect(collection, predicate)返回符合条件的元素集合
CollectionUtilstransform(collection, transformer)对集合中的元素进行转换
ListUtilspartition(list, size)将列表按指定大小分割成多个子列表
MapUtilsisEmpty(map)判断映射是否为空
MapUtilsisNotEmpty(map)判断映射是否非空
MapUtilsinvertMap(map)返回键值对中键和值互换的映射
SetUtilsunion(set1, set2)返回两个集合的并集
SetUtilsintersection(set1, set2)返回两个集合的交集
SetUtilssubtract(set1, set2)返回集合1中有,但集合2中没有的元素集合
SetUtilsisEqualSet(set1, set2)判断两个集合是否相等
ArrayUtilscontains(array, valueToFind)判断数组中是否包含指定元素
ArrayUtilsindexOf(array, valueToFind)返回指定元素在数组中的位置
ArrayUtilsadd(array, element)向数组中添加元素
ArrayUtilsremove(array, index)删除数组中指定位置的元素
ArrayUtilsclone(array)克隆一个数组
ArrayUtilsisEmpty(array)判断数组是否为空
ArrayUtilsisNotEmpty(array)判断数组是否非空

注:上述方法并非 Apache Commons Collections 所有工具类中的所有方法,仅列举部分常用方法供参考。

示例代码
Apache Commons Collections 工具类常用方法的示例代码
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;

import java.util.*;

public class CommonsCollectionsExample {
    public static void main(String[] args) {
        // 创建一个包含若干元素的列表
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

        // 取两个列表的交集
        Collection<Integer> intersection = CollectionUtils.intersection(list1, list2);
        System.out.println("交集:");
        System.out.println(intersection);

        // 取两个列表的并集
        Collection<Integer> union = CollectionUtils.union(list1, list2);
        System.out.println("并集:");
        System.out.println(union);

        // 取两个列表的差集
        Collection<Integer> difference = CollectionUtils.subtract(list1, list2);
        System.out.println("差集:");
        System.out.println(difference);

        // 判断一个列表是否为空或 null
        boolean emptyList = CollectionUtils.isEmpty(list1);
        System.out.println("list1 是否为空或 null:" + emptyList);

        // 创建一个包含若干元素的映射
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 判断一个映射是否为空或 null
        boolean emptyMap = MapUtils.isEmpty(map);
        System.out.println("map 是否为空或 null:" + emptyMap);

        // 获取映射中指定 key 对应的 value,如果不存在则返回默认值
        int value = MapUtils.getIntValue(map, "D", 0);
        System.out.println("key D 对应的 value:" + value);
    }
}
双向映射、有序Set和固定大小的队列
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.collections4.set.ListOrderedSet;

import java.util.Queue;

public class CommonsCollectionsExample {
    public static void main(String[] args) {
        // 创建一个双向映射,可以通过key获取value,也可以通过value获取key
        BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
        bidiMap.put("key1", "value1");
        bidiMap.put("key2", "value2");
        bidiMap.put("key3", "value3");
        System.out.println("双向映射:");
        System.out.println(bidiMap);
        // 通过value获取key
        System.out.println("value为value2的key:" + bidiMap.getKey("value2"));

        // 创建一个有序Set
        ListOrderedSet<String> orderedSet = new ListOrderedSet<>();
        orderedSet.add("b");
        orderedSet.add("a");
        orderedSet.add("c");
        System.out.println("有序Set:");
        System.out.println(orderedSet);

        // 创建一个固定大小的队列
        Queue<Integer> fixedSizeQueue = new CircularFifoQueue<>(3);
        fixedSizeQueue.offer(1);
        fixedSizeQueue.offer(2);
        fixedSizeQueue.offer(3);
        System.out.println("固定大小的队列(添加3个元素):");
        System.out.println(fixedSizeQueue);
        fixedSizeQueue.offer(4);
        System.out.println("固定大小的队列(再添加1个元素,将把队首的元素移除):");
        System.out.println(fixedSizeQueue);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

参果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值