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

    }
}
相关推荐
海清河晏1112 小时前
Linux进阶篇:深入理解线程
java·jvm·算法
Mr.朱鹏2 小时前
分布式接口幂等性实战指南【完整版】
java·spring boot·分布式·sql·spring·云原生·幂等
小二·2 小时前
会议精灵:用ModelEngine构建智能办公助手实战记录
开发语言·python
TAEHENGV2 小时前
提醒列表模块 Cordova 与 OpenHarmony 混合开发实战
android·java·harmonyos
崇山峻岭之间2 小时前
Matlab学习记录13
开发语言·学习·matlab
源码获取_wx:Fegn08952 小时前
基于springboot + vue宠物寄养系统
java·vue.js·spring boot·后端·spring·宠物
wjs20242 小时前
Python 变量类型
开发语言
沐知全栈开发2 小时前
Scala 数组
开发语言
jiayong232 小时前
Word 使用指南:标题间距调整与核心功能详解
开发语言·c#·word