Java中ArrayList的常见用法
Java 中的 ArrayList 是一个非常常用的动态数组,它属于 Java 集合框架的一部分。与普通数组不同,ArrayList 可以在需要时动态调整其大小。以下是 ArrayList 的一些详细介绍:
基本特性
- 动态大小:
ArrayList会自动调整其大小以适应新元素。 - 有序集合:元素按插入顺序存储,但可以通过索引访问。
- 允许重复:可以包含重复的元素。
- 允许空值:可以包含
null值。 - 非线程安全:在多线程环境下使用时需要手动同步。
常用方法
创建 ArrayList
ArrayList<String> list = new ArrayList<>();
添加元素
- 添加单个元素:
add(E e)list.add("apple");
- 在指定位置添加:
add(int index, E element)list.add(1, "banana");
- 添加单个元素:
访问元素
- 通过索引:
get(int index)String fruit = list.get(0);
- 通过索引:
修改元素
- 修改元素值:
set(int index, E element)list.set(1, "orange");
- 修改元素值:
删除元素
- 通过索引删除:
remove(int index)list.remove(0);
- 通过值删除(第一个匹配的元素):
remove(Object o)list.remove("banana");
- 通过索引删除:
遍历元素
for (String item : list) {
System.out.println(item);
}
其他常用方法
- 获取大小:
size() - 检查是否为空:
isEmpty() - 清空列表:
clear() - 检查是否包含指定元素:
contains(Object o) - 获取元素索引:
indexOf(Object o)
- 获取大小:
性能注意事项
- 时间复杂度:
- 添加/修改/获取元素:
O(1)(平均情况) - 在中间插入/删除元素:
O(n)
- 添加/修改/获取元素:
- 由于
ArrayList是基于数组实现的,当超过初始容量时,可能需要重新分配数组,这会涉及原数组到新数组的复制。
使用示例
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("apple");
list.add("banana");
list.add("cherry");
// 插入元素
list.add(1, "orange");
// 访问和修改元素
String fruit = list.get(0);
list.set(1, "kiwi");
// 删除元素
list.remove("banana");
// 输出列表
for (String item : list) {
System.out.println(item);
}
}
}
ArrayList 是适用于频繁访问和修改的场景,但在性能和安全性要求较高的情况下,选择其他集合(如 LinkedList 或同步列表)可能更为合适。
是的, ArrayList 只能存储引用数据类型,不能直接存储基本数据类型(如 int、double、char 等)。这是因为 ArrayList 是基于 Java 的泛型实现的,而泛型只支持对象类型(引用类型),不支持基本数据类型。
如何存储基本数据类型?
虽然 ArrayList 不能直接存储基本数据类型,但 Java 提供了自动装箱(Autoboxing)机制,可以将基本数据类型自动转换为对应的包装类,使其间接存储基本数据类型。
常见的基本数据类型及其对应的包装类
| 基本数据类型 | 包装类(引用类型) |
|---|---|
int |
Integer |
double |
Double |
char |
Character |
boolean |
Boolean |
float |
Float |
long |
Long |
short |
Short |
byte |
Byte |
示例:
ArrayList<Integer> intList = new ArrayList<>();
intList.add(10); // 自动装箱,将 int 转为 Integer
intList.add(20);
intList.add(30);
System.out.println(intList); // 输出: [10, 20, 30]
在这个例子中,10、20 和 30 是 int 类型的数据,但 Java 自动将它们转换为 Integer(包装类)对象,并存入了 ArrayList。
取值时自动拆箱
存储在 ArrayList 中的包装类对象,在需要时会自动转换回基本数据类型(称为“拆箱”)。
示例:
int sum = 0;
for (int num : intList) { // 自动拆箱,将 Integer 转为 int
sum += num;
}
System.out.println("总和:" + sum);
注意事项
性能
- 自动装箱和拆箱虽然使用方便,但它会增加一定的性能开销,尤其是频繁操作时。
避免空指针异常
- 如果
ArrayList中的某个元素为null,在拆箱时会抛出NullPointerException。 - 例如:
ArrayList<Integer> intList = new ArrayList<>();
intList.add(null); // 添加了一个 null
int num = intList.get(0); // 自动拆箱时抛出 NullPointerException
- 如果
如果需要存储多个不同的基本数据类型?
如果你的 ArrayList 需要同时存储多种基本数据类型,可以考虑以下几种方式:
使用
ArrayList<Object>- 通过手动装箱,将数据都存储为对应的包装类,然后将它们存入一个
ArrayList<Object>中。 - 示例:
ArrayList<Object> list = new ArrayList<>();
list.add(123); // 存储 Integer
list.add(45.67); // 存储 Double
list.add("Hello"); // 存储 String
list.add(true); // 存储 Boolean for (Object obj : list) {
System.out.println(obj.toString());
}
- 通过手动装箱,将数据都存储为对应的包装类,然后将它们存入一个
使用自定义类进行封装
- 自定义一个类,把所有需要的数据类型存为类的字段。
- 示例:
class Data {
int intValue;
double doubleValue;
String stringValue; Data(int intValue, double doubleValue, String stringValue) {
this.intValue = intValue;
this.doubleValue = doubleValue;
this.stringValue = stringValue;
}
} ArrayList<Data> dataList = new ArrayList<>();
dataList.add(new Data(10, 20.5, "Hello")); for (Data data : dataList) {
System.out.println(data.intValue + ", " + data.doubleValue + ", " + data.stringValue);
}
使用
Map或其他集合结构- 可以使用
Map<String, Object>或类似的容器,按键值对存储不同类型的数据。
- 可以使用
总结
ArrayList只能直接存储引用类型。- 如果要存储基本数据类型,可以通过包装类实现,依赖于自动装箱和拆箱机制。
- 对于需要混合存储多种类型的数据,可以使用
ArrayList<Object>或自定义类、Map等其他结构。-
Java中ArrayList的常见用法的更多相关文章
- JAVA中enum的常见用法
JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- [转] Java中ArrayList类的用法
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- K:java中枚举的常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...
- Java中ArrayList类的用法
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- Java中Date各种相关用法
Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...
随机推荐
- std的map或者set中,比较浮点类型二维三维数据
在map和set中,如果比较对象是二维或者三维数据,需要把二维三维数据的浮点数转换为比较精度. 如果比较精度是0.001,那么数据的精度也必须是0.001,不然会出现如下情况: 比较函数 struct ...
- 不错的AI项目集合
最近收集了一些不错的AI项目. AutoGPT:AutoGPT 的愿景是让每个人都可以使用和构建无障碍 AI.我们的使命是提供工具,以便您可以专注于重要的事情. Stable Diffusion we ...
- 如何使用对象存储 COS ?七个步骤,帮你搞定!
导语:本文将介绍新手如何使用对象存储 COS,主要面向小白用户,旨在快速带领用户了解 COS 的优势.功能.费用.接口及控制台指南. 01 什么是对象存储 腾讯云对象存储 COS(Cloud Obje ...
- hibernate错误org.hibernate.AnnotationException: No identifier specified for entity:
实体类继承BaseEntity时报错.解决方法:在属性或者get方法上加@Id@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(uniqu ...
- Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制
一.前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是win ...
- Qt开源作品37-网络中转服务器
一.前言 用Qt做开发10年了,其中做过好多项目,基于现在web和移动互联网发展如此迅猛,大量的应用场景需要一个网络中转服务器,可以实现手机app或者其他客户端远程回控设备,现在物联网发展非常迅猛,这 ...
- uniapp请求封装-token无感刷新
当前是vue3+ts版本的封装 vue3+js版本请求封装可参考 https://www.cnblogs.com/lovejielive/p/14343619.html token无感刷新,可自行删除 ...
- asp.net core Theme 中间件
asp.net core中自定义视图引擎,继承接口 IViewLocationExpander public class ThemeViewLocationExpander : IViewLocati ...
- [.NET] 单位转换实践:深入解析 Units.NET
单位转换实践:深入解析 Units.NET 摘要 在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求.无论是处理温度.长度.重量还是其他物理量,都需要可靠的单位转换机制.本文将深入介绍 U ...
- 记录实现倒计时的方法,配合按钮的disabled
记录一个自己实现倒计时的方法,现在可以网上有很多插件,自己实现记录一下 // 倒计时 countDown() { this.disabled = true let number = 60 this.c ...