Java中ArrayList那点事

发布时间:2025-04-01 09:18

记录生活中的转折点:那些改变人生的故事 #生活乐趣# #生活分享# #个人生活感悟# #生活故事记叙#

1.概述

在本文中,我们将从Java Collections 框架中查看ArrayList类。我们将讨论它的属性,常见用例,以及它的优缺点。

ArrayList在Java核心库中,因此您不需要任何其他库。要使用它,只需添加以下import语句:

import java.util.ArrayList; 1

List表示有序的值序列,其中某些值可能出现多次。

ArrayList是在数组上构建的List实现之一,它可以在添加/删除元素时动态增长和缩小。从0开始,索引可以轻松访问元素。此实现具有以下属性:

随机访问需要O(1)时间添加元素需要消耗的固定时间O(1)插入/删除需要O(n)时间在已排序的数组搜索需要O(n)的时间和在未排序的数组上搜索需要O(log n)的时间 2.构造函数

ArrayList有几个构造函数,我们将在本节中介绍它们。

首先,请注意ArrayList是一个泛型类,因此您可以使用您想要的任何类型对其进行参数化,编译器将确保您无法将Integer值放入字符串集合中。此外,从集合中检索元素时,不需要强制转换元素。

其次,好的作法是使用通用接口List作为变量类型,因为它将它与特定实现分离。

2.1 默认的无参构造函数

List<String> list = new ArrayList<>(); assertTrue(list.isEmpty()); 12

我们只是创建一个空的ArrayList实例。

2.2 构造函数(初始容量)

List<String> list = new ArrayList<>(20); 1

在这里指定基础数组的初始长度。这可以帮助您在添加新项目时避免不必要的大小调整。

2.3 构造函数接受集合

Collection<Integer> number = IntStream.range(0, 10).boxed().collect(toSet()); List<Integer> list = new ArrayList<>(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list)); 123456

请注意,Collection实例的元素用于填充底层数组。

3.添加元素

您可以在末尾或特定位置插入元素:

List<Long> list = new ArrayList<>(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list)); 1234567

您也可以一次插入一个或多个元素:

List<Long> list = new ArrayList<>(Arrays.asList(1L, 2L, 3L)); LongStream.range(4, 10).boxed() .collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys))); assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list)); 1234 4.迭代器

有两种类型的迭代器可用:Iterator和ListIterator。前者使您有机会在一个方向上遍历列表,后者允许您在两个方向上遍历它。

这里我们只向您展示ListIterator:

List<Integer> list = new ArrayList<>( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); ListIterator<Integer> it = list.listIterator(list.size()); List<Integer> result = new ArrayList<>(list.size()); while (it.hasPrevious()) { result.add(it.previous()); } Collections.reverse(list); assertThat(result, equalTo(list)); 123456789101112

您还可以使用迭代器搜索,添加或删除元素。

5.在列表中搜索

我们将演示如何使用集合进行搜索:

List<String> list = LongStream.range(0, 16) .boxed() .map(Long::toHexString) .collect(toCollection(ArrayList::new)); List<String> stringsToSearch = new ArrayList<>(list); stringsToSearch.addAll(list); 123456 5.1 搜索未排序的数组

为了找到一个元素,您可以使用indexOf()或lastIndexOf()方法。它们都接受一个对象并返回int值:

assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a")); 12

如果要查找满足谓词的所有元素,可以使用Predicate过滤使用Java 8 Stream API,如下所示:

Set<String> matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9")); List<String> result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size()); 12345678

也可以使用for循环或迭代器:

Iterator<String> it = stringsToSearch.iterator(); Set<String> matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9")); List<String> result = new ArrayList<>(); while (it.hasNext()) { String s = it.next(); if (matchingStrings.contains(s)) { result.add(s); } } 12345678910 5.2 搜索已排序的数组

如果你有一个排序数组,那么你可以使用二进制搜索算法,它比线性搜索更快:

List<String> copy = new ArrayList<>(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1))); 1234

请注意,如果找不到元素,则返回-1。

6.删除元素

为了删除元素,您应该找到它的索引,然后才能通过remove()方法执行删除。此方法的重载版本接受一个对象,搜索它并执行删除第一次出现的相等元素:

List<Integer> list = new ArrayList<>( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); Collections.reverse(list); list.remove(0); assertThat(list.get(0), equalTo(8)); list.remove(Integer.valueOf(0)); assertFalse(list.contains(0)); 12345678910

但是在处理基础类型(如Integer)时要小心。为了删除特定元素,您应该首先输入int值,否则,元素将被其索引删除。

您也可以使用上述Stream API删除多个项目,但我们不在此处进行展示。为此,我们将使用迭代器:

Set<String> matchingStrings = HashSet<>(Arrays.asList("a", "b", "c", "d", "e", "f")); Iterator<String> it = stringsToSearch.iterator(); while (it.hasNext()) { if (matchingStrings.contains(it.next())) { it.remove(); } } 123456789 7.总结

在这篇文章中,我们看了一下Java中的ArrayList。

我们展示了如何创建一个ArrayList实例,如何使用不同的方法添加,查找或删除元素。

关注微信公众号:Java知己
回复关键词:ArrayList,获取源代码

image

image

网址:Java中ArrayList那点事 https://www.yuejiaxmz.com/news/view/845945

相关内容

java list clear 垃圾回收
Java 中节省 90% 时间的常用的工具类
用Java程序实现简单的美食推荐
java中给集合赋值的方法
JAVA基础总结(四)
java中数组倒序
Java操作mongodb增删改查的基本操作实战指南
智慧城市如何通过技术手段提升城市生活的质量与效率?请结合实际案例分析其在城市规划和管理中的应用。
Java 零基础入门学习(小白也能看懂!)
java局部变量如何及时清理

随便看看