当前位置: 首页 > java >正文

java的arraylist集合

一、ArrayList 是什么?

  • 动态数组:ArrayList 是 Java 中一个可动态调整大小的数组,属于 java.util 包。

  • 与普通数组的区别:普通数组长度固定,而 ArrayList 可以自动扩容。

  • 泛型支持:可以存储任意类型的对象(需指定泛型,如 ArrayList<String>)。


二、基本操作(代码示例)

1. 创建 ArrayList

import java.util.ArrayList;
​
public class Main {public static void main(String[] args) {// 创建一个存储 String 的 ArrayListArrayList<String> names = new ArrayList<>();
​// 创建一个存储 Integer 的 ArrayListArrayList<Integer> numbers = new ArrayList<>();}
}

2. 添加元素

names.add("Alice");   // 添加到末尾
names.add(0, "Bob");  // 在索引 0 处插入
// 现在列表内容:["Bob", "Alice"]

3. 访问元素

String first = names.get(0);  // 获取索引 0 的元素("Bob")

4. 修改元素

names.set(1, "Charlie");  // 将索引 1 改为 "Charlie"
// 现在列表内容:["Bob", "Charlie"]

5. 删除元素

names.remove(0);          // 删除索引 0 的元素("Bob")
names.remove("Charlie");  // 直接删除元素 "Charlie"

6. 获取长度

int size = names.size();  // 当前列表长度

7. 遍历 ArrayList

// 方法 1:普通 for 循环
for (int i = 0; i < names.size(); i++) {System.out.println(names.get(i));
}
​
// 方法 2:增强 for 循环(推荐)
for (String name : names) {System.out.println(name);
}
​
// 方法 3:使用迭代器
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}

三、ArrayList 的特点

  1. 动态扩容:默认初始容量为 10,当元素超过容量时,自动增加 50%(如 10 → 15 → 22 ...)。

  2. 随机访问快:通过索引访问元素的时间复杂度是 O(1)。

  3. 增删元素慢:在中间插入或删除元素需要移动后续元素,时间复杂度 O(n)。


四、常见方法速查表

方法作用
add(E e)添加元素到末尾
add(int index, E e)在指定位置插入元素
get(int index)获取索引处的元素
set(int index, E e)修改索引处的元素
remove(int index)删除索引处的元素
remove(Object o)删除指定元素(首次出现)
size()返回列表长度
contains(Object o)判断是否包含某元素
clear()清空列表

五、使用场景

  • 当需要频繁访问元素,但较少插入/删除时(如缓存数据)。

  • 需要动态调整集合大小时(代替传统数组)。


六、注意事项

  1. 非线程安全:多线程环境下推荐使用 VectorCollections.synchronizedList()

  2. 存储对象类型:只能存储对象(如 IntegerString),不能存储基本类型(如 intchar)。

  3. 初始容量优化:如果预先知道数据量较大,可通过 new ArrayList<>(100) 指定初始容量,减少扩容次数。


七、练习题目

  1. 创建一个存储整数的 ArrayList,添加 10 个随机数,然后计算它们的总和。

  2. 编写一个方法,接收一个 ArrayList<String>,返回所有长度大于 5 的字符串。


如果有任何疑问,或需要更深入的示例,请随时告诉我!我们可以一步步完善你的理解。

在 Java 的 ArrayList 中查找某个数(或对象),可以通过以下几种方法实现:


1. 使用 contains() 方法

判断集合中是否包含指定元素(返回 true/false)。

ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 8, 2, 7));
​
int target = 8;
if (numbers.contains(target)) {System.out.println("找到了 " + target);
} else {System.out.println("没找到 " + target);
}

2. 使用 indexOf() 方法

返回元素在集合中的索引(未找到返回 -1)。

int index = numbers.indexOf(target);
if (index != -1) {System.out.println(target + " 的索引是: " + index);
} else {System.out.println(target + " 不存在");
}

3. 手动遍历查找

如果需自定义查找逻辑(例如找大于某值的数),可以用循环遍历:

boolean found = false;
for (int num : numbers) {if (num == target) {found = true;break;}
}
System.out.println(found ? "存在" : "不存在");

4. 使用 Java 8 Stream API

通过 filterfindFirst 实现更灵活的查找:

Optional<Integer> result = numbers.stream().filter(n -> n == target).findFirst();
​
if (result.isPresent()) {System.out.println("找到了: " + result.get());
} else {System.out.println("没找到");
}

注意事项

  1. 对象比较:如果 ArrayList 存储的是自定义对象(如 Person),需要正确重写 equals() 方法,否则 contains()indexOf() 无法正确比较。

  2. 基本类型:ArrayList 不能直接存储基本类型(如 int),需使用包装类(如 Integer)。

  3. 性能contains()indexOf() 的时间复杂度是 O(n)(需要遍历列表)。


完整示例

import java.util.ArrayList;
import java.util.Arrays;
​
public class Main {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(5, 3, 8, 2, 7));int target = 8;
​// 方法1: contains()System.out.println("是否包含8? " + numbers.contains(target));
​// 方法2: indexOf()int index = numbers.indexOf(target);System.out.println("8的索引是: " + index);
​// 方法3: 遍历for (int num : numbers) {if (num == target) {System.out.println("通过遍历找到8");break;}}}
}

输出结果:

是否包含8? true
8的索引是: 2
通过遍历找到8

如果有其他具体需求(如查找多个符合条件的数),可以进一步优化代码!

http://www.xdnf.cn/news/7385.html

相关文章:

  • TransactionSynchronizationManager事务同步器的使用
  • 统计客户端使用情况,使用es存储数据,实现去重以及计数
  • 【全解析】EN18031标准下的SCM安全通信机制全解析
  • 质检LIMS系统检测数据可视化大屏 全流程提效 + 合规安全双保障方案
  • 视频监控中的存储方式有哪些?EasyCVR视频监控汇聚平台如何打造高效监控存储
  • 高速系统设计实例设计分析之三
  • 蓝桥杯2300 质数拆分
  • 码蹄集——N是什么、棋盘
  • JVM(Java 虚拟机)深度解析
  • web基础常用标签
  • More Effective C++:改善编程与设计(下)
  • Seata源码—6.Seata AT模式的数据源代理三
  • 洛谷U536262 井底之“鸡” 附视频讲解
  • 提示词专家的修炼秘籍
  • harris角点检测
  • VisionPro:轴承错位标识
  • QT之绘图模块和双缓冲技术
  • MapStruct Date 转 LocalDate 偏差一天问题
  • 【C++】异常解析
  • AGI大模型(28):LangChain提示模板
  • MySQL中的Change Buffer是什么,它有什么作用?
  • 火山 RTC 引擎9 ----集成 appkey
  • 5月19日笔记
  • 4.7 时间模块
  • 网络传输(ping命令,wget命令,curl命令),端口
  • 接口排查不能靠猜:实战中如何用抓包工具精准定位问题(含 Charles 使用示例)
  • 人工智能、机器学习与深度学习:全面介绍与对比分析
  • 组态王通过开疆智能profinet转ModbusTCP网关连接西门子PLC配置案例
  • 队列和栈的区别
  • 【科研项目】大三保研人科研经历提升