学习Java32天

ArrayList 概述

集合与数组对比

特性 数组 ArrayList
长度 固定 可变(自动扩容)
存储类型 基本类型和引用类型 只能存储引用类型
性能 随机访问快 随机访问快,但增删慢
内存 连续内存 动态数组
安全性 编译时类型检查 泛型类型检查

基本数据类型包装类

基本类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

ArrayList 成员方法详解

1. 创建 ArrayList 对象

java

复制代码
import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        // 方式1:完整写法
        ArrayList<String> list1 = new ArrayList<String>();
        
        // 方式2:JDK7+ 推荐写法(类型推断)
        ArrayList<String> list2 = new ArrayList<>();
        
        // 方式3:指定初始容量
        ArrayList<String> list3 = new ArrayList<>(100);
        
        // 方式4:存储基本类型(使用包装类)
        ArrayList<Integer> intList = new ArrayList<>();
        ArrayList<Double> doubleList = new ArrayList<>();
        ArrayList<Character> charList = new ArrayList<>();
        ArrayList<Boolean> boolList = new ArrayList<>();
    }
}

2. 添加元素 - add()

java

复制代码
public class AddMethodDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        
        // 1. 添加单个元素
        boolean result1 = list.add("Java");
        System.out.println("添加结果: " + result1);  // true
        System.out.println("集合内容: " + list);      // [Java]
        
        // 2. 连续添加多个元素
        list.add("Python");
        list.add("C++");
        list.add("JavaScript");
        System.out.println("添加多个后: " + list);  // [Java, Python, C++, JavaScript]
        
        // 3. 在指定位置插入元素
        list.add(1, "Go");  // 在索引1处插入
        System.out.println("插入后: " + list);  // [Java, Go, Python, C++, JavaScript]
        
        // 4. 添加基本类型(自动装箱)
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(10);      // 自动装箱:int -> Integer
        numbers.add(20);
        numbers.add(30);
        System.out.println("数字集合: " + numbers);  // [10, 20, 30]
    }
}

3. 删除元素 - remove()

java

复制代码
public class RemoveMethodDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("JavaScript");
        list.add("Java");  // 重复元素
        System.out.println("原始集合: " + list);  // [Java, Python, C++, JavaScript, Java]
        
        // 1. 删除指定元素(删除第一个匹配项)
        boolean result1 = list.remove("Java");
        System.out.println("删除结果: " + result1);  // true
        System.out.println("删除后: " + list);       // [Python, C++, JavaScript, Java]
        
        // 2. 按索引删除
        String removedElement = list.remove(1);  // 删除索引1的元素
        System.out.println("删除的元素: " + removedElement);  // C++
        System.out.println("删除后: " + list);               // [Python, JavaScript, Java]
        
        // 3. 删除不存在的元素
        boolean result2 = list.remove("Ruby");
        System.out.println("删除Ruby结果: " + result2);  // false
        
        // 4. 删除所有指定元素
        while (list.contains("Java")) {
            list.remove("Java");
        }
        System.out.println("删除所有Java后: " + list);  // [Python, JavaScript]
    }
}

4. 修改元素 - set()

java

复制代码
public class SetMethodDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        System.out.println("修改前: " + list);  // [Java, Python, C++]
        
        // 修改指定索引的元素
        String oldValue = list.set(1, "JavaScript");
        System.out.println("被替换的元素: " + oldValue);  // Python
        System.out.println("修改后: " + list);            // [Java, JavaScript, C++]
        
        // 修改不存在的索引会抛出异常
        try {
            list.set(5, "Ruby");  // 索引越界
        } catch (IndexOutOfBoundsException e) {
            System.out.println("错误: " + e.getMessage());
        }
    }
}

5. 查询元素 - get() 和 size()

java

复制代码
public class GetMethodDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");
        list.add("JavaScript");
        list.add("Go");
        
        // 1. 获取集合大小
        int size = list.size();
        System.out.println("集合大小: " + size);  // 5
        
        // 2. 获取指定索引的元素
        String element = list.get(2);
        System.out.println("索引2的元素: " + element);  // C++
        
        // 3. 遍历集合(三种方式)
        System.out.println("\n方式1:普通for循环");
        for (int i = 0; i < list.size(); i++) {
            System.out.println("索引 " + i + ": " + list.get(i));
        }
        
        System.out.println("\n方式2:增强for循环");
        for (String str : list) {
            System.out.println(str);
        }
        
        System.out.println("\n方式3:forEach + Lambda(Java 8+)");
        list.forEach(str -> System.out.println(str));
        
        // 4. 获取不存在的索引会抛出异常
        try {
            String value = list.get(10);
        } catch (IndexOutOfBoundsException e) {
            System.out.println("\n错误:索引越界");
        }
    }
}

ArrayList 其他常用方法

1. 清空集合

java

复制代码
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");

list.clear();  // 清空所有元素
System.out.println(list.size());  // 0
System.out.println(list.isEmpty());  // true

2. 判断是否包含

java

复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");

System.out.println(list.contains("Java"));  // true
System.out.println(list.contains("Ruby"));  // false

3. 获取元素索引

java

复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java");

System.out.println(list.indexOf("Java"));  // 0(第一个)
System.out.println(list.lastIndexOf("Java"));  // 2(最后一个)
System.out.println(list.indexOf("Ruby"));  // -1(不存在)

4. 转换为数组

java

复制代码
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");

// 转换为数组
String[] array = list.toArray(new String[0]);
for (String str : array) {
    System.out.println(str);
}

注意事项

1. 泛型的重要性

java

复制代码
// 正确:使用泛型
ArrayList<String> list1 = new ArrayList<>();
list1.add("Hello");

// 错误:不使用泛型(不推荐)
ArrayList list2 = new ArrayList();
list2.add("Hello");
list2.add(123);  // 可以添加不同类型,但容易出错
String str = (String) list2.get(1);  // 运行时异常:ClassCastException

2. 性能考虑

  • ArrayList 适合随机访问,不适合频繁的插入和删除

  • 如果知道大致容量,可以在创建时指定初始容量

  • 频繁增删时考虑使用 LinkedList

3. 并发安全

  • ArrayList 不是线程安全的

  • 多线程环境下应该使用 Collections.synchronizedList() 或 CopyOnWriteArrayList

java 复制代码
import java.util.ArrayList;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        //1.创建集合对象
        //泛型:限定集合存储的数据类型
        //此时我们创建的是ArrayList的对象,而ArrayList是Java已经写好的一个类
        //这个类在底层做了一些处理
        //打印对象不是地址值,而是集合中存储的数据内容
        //在展示时我们会拿[]把所有数据进行包裹
        ArrayList<String> list = new ArrayList<String>();
        //JDK7以后
        //ArrayList<String> list = new ArrayList<>();
        System.out.println(list);
    }
}
java 复制代码
import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println("空字符串:"+list);
        //增
        System.out.println("添加hello,world,111,222");
        boolean result = list.add("hello");
        list.add("world");
        list.add("111");
        list.add("222");
        System.out.println("是否添加成功:"+result);
        System.out.println("添加后的结果:"+list);
        System.out.println("------------------");

        //删
        System.out.println("删除world");
        boolean result1 = list.remove("world");
        System.out.println("是否删除成功:"+result1);
        System.out.println("删除后的结果:"+list);
        System.out.println("--------------------");
        System.out.println("删除0索引的数据");
        String result3 = list.remove(0);
        System.out.println(result3+"被删除");
        System.out.println("剩下数据:"+list);
        System.out.println("--------------------");

        //改
        System.out.println("将0索引的数据改为333");
        String result4 = list.set(0,"333");
        System.out.println(result4+"被更改");
        System.out.println("更改后的数据为:"+list);
        System.out.println("----------------------");

        //查
        System.out.println("获取1索引的数据和集合的长度");
        System.out.println("获取1索引的数据为::"+list.get(1));
        System.out.println("集合的长度为:"+list.size());

    }
}
相关推荐
Mr -老鬼11 分钟前
Java VS Rust
java·开发语言·rust
北凉军18 分钟前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
程序员张328 分钟前
Mybatis条件判断某属性是否等于指定字符串
java·spring boot·mybatis
wuk99828 分钟前
基于C#与三菱PLC通过TCPIP实现MC协议通信示例
java·网络·c#
沛沛老爹36 分钟前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
码农小卡拉41 分钟前
Maven与Gradle选型指南:如何匹配项目的依赖管理需求
java·gradle·maven
avi911144 分钟前
Unity 天命6源码- 商业游戏说明分析
开发语言·unity·c#·游戏开发·游戏源码
黎雁·泠崖44 分钟前
吃透Java操作符进阶:算术+移位操作符 全解析(Java&C区别+完整案例+避坑指南)
java·c语言·python
低频电磁之道1 小时前
编译C++的几种方式(MSVC编译器)
开发语言·c++
Zsy_0510031 小时前
【C++】类和对象(一)
开发语言·c++