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

Java的ArrayList集合

Java的ArrayList集合

ArrayList 是 Java 中常用的集合类,属于 java.util 包。它实现了 List 接口,提供了一种动态数组的实现。

一、集合和数组的对比

  • 长度和存储类型:
    • 数组:可以存储基本数据类型和引用数据类型,且长度在创建后是固定的
    • 集合:存储引用数据类型、基本数据类型和包装类,且集合的长度是可变的

二、ArrayList的内容

1. 特性

  • 动态大小:与传统数组不同,ArrayList 的大小是动态变化的。当添加新元素时,ArrayList 会自动扩展其内部数组。
  • 存储类型ArrayList 可以存储任何类型的对象,包括基本类型的包装类(如 IntegerDouble 等)和自定义对象。
  • 索引访问ArrayList 提供基于索引的访问,允许快速访问元素,时间复杂度为 O(1)。
  • 有序性ArrayList 保持元素的插入顺序,元素的索引从 0 开始。
  • 允许重复ArrayList 允许存储重复的元素。

2. 创建 ArrayList

可以使用无参数构造函数或指定初始容量的构造函数创建 ArrayList

ArrayList<String> list = new ArrayList<>(); // 默认初始容量为 10
ArrayList<Integer> numbers = new ArrayList<>(20); // 初始容量为 20

注意事项

  • 打印对象不是地址值,而是集合中存储的数据内容

3. 常见操作

添加元素
  • add(E e):在列表末尾添加元素,返回值是一个布尔类型,且一般是true(添加成功)
list.add("Hello");
  • add(int index, E element):在指定位置插入元素,该位置原本的元素及后面的元素都会向后平移
list.add(1, "World"); // 在索引 1 处插入 "World"
获取元素
  • get(int index):获取指定索引处的元素。
String str = list.get(0); // 获取索引 0 处的元素
删除元素
  • remove(int index):删除指定索引处的元素,并会返回被删除的元素。
list.remove(0); // 删除索引 0 处的元素
  • remove(Object o):删除首次出现的指定元素,删除成功则返回true,失败则返回false
list.remove("Hello"); // 删除 "Hello"
修改元素
  • set(int index, E element):更新指定索引处的元素,并会返回被修改的值
list.set(0, "Java"); // 将索引 0 处的元素更新为 "Java"
遍历集合

可以使用 for 循环、增强 for 循环、迭代器等遍历 ArrayList

for (String s : list) {
    System.out.println(s);
}

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

4. 其他重要方法

  • size():返回列表中元素的数量。
int size = list.size();
  • isEmpty():检查列表是否为空。
boolean isEmpty = list.isEmpty();
  • clear():清空列表中的所有元素。
list.clear();
  • contains(Object o):检查列表是否包含指定元素。
boolean containsHello = list.contains("Hello");

5. 性能注意事项

  • 扩容性能:当 ArrayList 的容量不足时,它会创建一个更大的数组(通常是原数组的 1.5 倍),并将现有元素复制到新数组中。频繁的扩容会影响性能。
  • 空间复杂度ArrayList 在添加大量元素时,可能会浪费一些内存,因为它的实际大小可能会大于当前存储的元素数量。

6. 总结

ArrayList 是一个灵活且易于使用的动态数组实现,适合存储和操作可变长度的对象集合。它提供了丰富的方法和良好的性能,但在需要频繁插入和删除元素时,可以考虑使用 LinkedList,因为其在中间位置插入和删除元素时性能更佳。

三、集合保存一个具体的类

格式ArrayList<类名> list = new ArrayList<>();

示例

package com.my.test04;

public class Phone {
    private String brand;
    private int price;

    public Phone() {

    }

    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

package com.my.test04;

import java.util.ArrayList;
import java.util.Scanner;

public class Demo06 {
    public static void main(String[] args) {
        Phone p1 = new Phone("小米", 1000);
        Phone p2 = new Phone("苹果", 8000);
        Phone p3 = new Phone("锤子", 2999);

        Scanner in = new Scanner(System.in);
        ArrayList<Phone> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);

        // 调用创建的方法
        ArrayList<Phone> phoneInfo = getPhoneInfo(list);
        for (int i = 0; i < phoneInfo.size(); i++) {
            Phone p = new Phone();
            p = phoneInfo.get(i);
            System.out.println(p.getBrand() + ", " + p.getPrice());
        }
    }

    // 返回价格低于3000的手机信息
    // 如果要返回多个数据,可以先把这些数据放到一个容器中,再把容器返回
    public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list) {
        ArrayList<Phone> resultphone = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            Phone p = list.get(i);
            int price = p.getPrice();
            if(price < 3000) {
//                System.out.println(p.getBrand() + ", " + p.getPrice());
                resultphone.add(p);
            }
        }
        return resultphone;
    }
}

  • 要将整个容器返回是因为在实际的开发中,需要返回这些值,便于操作,而不是单单直接打印。
  • 且集合保存的都是类的地址,故返回的新集合中的数据,同原集合一起操作保存的类的值。

四、基本数据类型对应的包装类

​ 当要使用集合保存基本数据类型时,需要将基本数据类型转换成包装类。

在这里插入图片描述


http://www.kler.cn/a/371114.html

相关文章:

  • windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(三)
  • ARCGIS PRO SDK 实现图层标注
  • 深入理解Java虚拟机(六)
  • 知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)
  • 实验九 视图的使用
  • Hexo提交部署命令与Git Bash Here控制终端中按下Ctrl+C无法中断hexo s的解决办法
  • 开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码
  • SpringMVC学习(3)
  • Android的SQLiteOpenHelper类 笔记241027
  • 开发了一个成人学位英语助考微信小程序
  • Spark SQL DSL
  • QNAP威联通NAS怎么通过HBS3设置定时备份计划至外部存储
  • Python日志系统详解:Logging模块最佳实践
  • 如何选择适合自己的 Python IDE
  • 「C/C++」C++11 之 std::pair单元存储的途径
  • Rust 基础语法与常用特性
  • 论文略读:Can We Edit Factual Knowledge by In-Context Learning?
  • 154. 寻找旋转排序数组中的最小值 II
  • MATLAB车道检测与跟踪
  • ctfshow(179->182)--SQL注入--更多过滤与like运算符