学习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());

    }
}
相关推荐
mftang1 小时前
Python 字符串拼接成字节详解
开发语言·python
jasligea1 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka1 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
C雨后彩虹1 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
云栖梦泽2 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化
开发语言
java1234_小锋2 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐3 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
福大大架构师每日一题3 小时前
ComfyUI v0.11.1正式发布:新增开发者专属节点支持、API节点强化、Python 3.14兼容性更新等全方位优化!
开发语言·python