Java 中的 ArrayList 是一个非常常用的动态数组,它属于 Java 集合框架的一部分。与普通数组不同,ArrayList 可以在需要时动态调整其大小。以下是 ArrayList 的一些详细介绍:

基本特性

  1. 动态大小ArrayList 会自动调整其大小以适应新元素。
  2. 有序集合:元素按插入顺序存储,但可以通过索引访问。
  3. 允许重复:可以包含重复的元素。
  4. 允许空值:可以包含 null 值。
  5. 非线程安全:在多线程环境下使用时需要手动同步。

常用方法

  • 创建 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 只能存储引用数据类型,不能直接存储基本数据类型(如 intdoublechar 等)。这是因为 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]

在这个例子中,102030int 类型的数据,但 Java 自动将它们转换为 Integer(包装类)对象,并存入了 ArrayList

取值时自动拆箱

存储在 ArrayList 中的包装类对象,在需要时会自动转换回基本数据类型(称为“拆箱”)。

示例:

int sum = 0;
for (int num : intList) { // 自动拆箱,将 Integer 转为 int
sum += num;
}
System.out.println("总和:" + sum);

注意事项

  1. 性能

    • 自动装箱和拆箱虽然使用方便,但它会增加一定的性能开销,尤其是频繁操作时。
  2. 避免空指针异常

    • 如果 ArrayList 中的某个元素为 null,在拆箱时会抛出 NullPointerException
    • 例如:
      ArrayList<Integer> intList = new ArrayList<>();
      intList.add(null); // 添加了一个 null
      int num = intList.get(0); // 自动拆箱时抛出 NullPointerException

如果需要存储多个不同的基本数据类型?

如果你的 ArrayList 需要同时存储多种基本数据类型,可以考虑以下几种方式:

  1. 使用 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());
      }
  2. 使用自定义类进行封装

    • 自定义一个类,把所有需要的数据类型存为类的字段。
    • 示例:
      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);
      }
  3. 使用 Map 或其他集合结构

    • 可以使用 Map<String, Object> 或类似的容器,按键值对存储不同类型的数据。

总结

  • ArrayList 只能直接存储引用类型。
  • 如果要存储基本数据类型,可以通过包装类实现,依赖于自动装箱和拆箱机制。
  • 对于需要混合存储多种类型的数据,可以使用 ArrayList<Object> 或自定义类、Map 等其他结构。-

Java中ArrayList的常见用法的更多相关文章

  1. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  2. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  3. [转] Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  4. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

  5. Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  6. JAVA中ArrayList用法

    JAVA中ArrayList用法 2011-07-20 15:02:03|  分类: 计算机专业 |  标签:java  arraylist用法  |举报|字号 订阅     Java学习过程中做题时 ...

  7. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  8. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  9. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  10. Java中Date各种相关用法

    Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...

随机推荐

  1. WebSocket事件

    优点 双通信,减少延迟 四个主要的Web Socket API事件: ·打开 onopen 当在客户端和服务器建立连接,就会从Web Socket实例触发open事件.它被称为客户端和服务器之间的初始 ...

  2. C/C++源码扫描系列- Joern 篇

    文章首发于 https://xz.aliyun.com/t/9277 概述 和 codeql,Fortify 相比 Joern不需要编译源码即可进行扫描,适用场景和环境搭建方面更加简单. 环境搭建 首 ...

  3. docker安装Nginx并运行vue3前端

    Docker安装Nginx #获取Nginx docker pull nginx #查端口 netstat -ntlp #建本地目录 mkdir -p /home/nginx/www /home/ng ...

  4. IOS跳转到系统相册及一些其他的URL Scheme

    IOS跳转到系统相册及一些其他的URL Scheme APP 间的跳转主要通过 UIApplication.shared.openURL(url) 这种方法来实现的,但iOS10 后又稍加不同,iOS ...

  5. metasploit扫描mysql空密码

    靶机IP 192.168.255.100 攻击机IP 192.168.255.200 流程开始 查找mysql登录模块 msf5 > search mysql_login 加载这个模块 msf5 ...

  6. 【MyBatis】学习笔记08:批量删除

    [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybatis]学习笔记02:实现简单的查 [MyBatis]学习笔记03:配置文件进一步解读(非常重要) [MyBatis]学习笔记04:配 ...

  7. 完美解决idea2020一直indexing,无法操作的问题

    hello,大家好,2021年的第一篇文章,希望疫情早日过去,大家早日恢复正常生活. 今天主要分享一下在使用idea 2020.3版本开发maven项目的时候,一直出现有效件index, 有时候是sc ...

  8. Qt编写视频监控系统70-OSD标签和图形信息(支持写入到文件)

    一.前言 作为一个完整的视频监控系统,用户还需要自定义一些OSD标签信息显示在对应通道上面,而且不止一个OSD标签信息,位置可以在四个角或者指定坐标显示.最开始本系统设计的时候,由于本人擅长的是pai ...

  9. Qt开发经验小技巧186-190

    关于是使用QList还是QVector的问题,一直是众多Qter的选择问题,主要是这两个玩意提供的的接口函数基本一致,比如插入.删除.取值等. 大多数情况下可以用QList.像append.prepe ...

  10. Qt音视频开发18-海康sdk回调

    一.前言 海康sdk显示实时视频流除了支持句柄方式以外,也支持回调的方式拿到每一张图片自己绘制处理,当然回调除了拿到视频数据,其实音频数据也一块拿到了,自行调用音频设备播放就行,关于海康sdk回调这块 ...