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

    }
}
相关推荐
北i5 分钟前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
10mAh17 分钟前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
thefool11226633 分钟前
多线程 4
java
wewowilling38 分钟前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小羊没烦恼!1 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
棉猴1 小时前
玩游戏学Python5-函数
开发语言·python·函数·玩游戏·游戏编程
Rain的Java大神之路1 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
高级程序源1 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
谢亮_vipxieliang1 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
IT研究室1 小时前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计