ArrayList

ArrayList

知识点

这里写图片描述

数组长度

ArrayList底层是维护了一个Object数组实现 的,使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍。

ArrayList 非特有的方法

即List接口的方法,具体代码示例可参考上一篇博客。
这里写图片描述

需求: 编写一个函数清除集合中重复元素。
package collection;

import java.util.ArrayList;
import java.util.Iterator;

class Book {

    int id;

    String name;

    public Book(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "【书号:" + this.id + "    书名:" + this.name + "】";

    }

    @Override
    public boolean equals(Object obj) {// 书号(id)相同,视为重复
        Book book = (Book) obj;
        return this.id == book.id;
    }

}

public class Demo3 {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Book(3187, "《艺术人生》"));
        list.add(new Book(3398, "《美术精选》"));
        list.add(new Book(8513, "《宋词集》"));
        list.add(new Book(3187, "《艺术》"));

        ArrayList list1 = clearRepeat(list);
        System.out.println(list1);//[【书号:3187    书名:《艺术人生》】, 【书号:3398    书名:《美术精选》】, 【书号:8513    书名:《宋词集》】]


    }

    public static ArrayList clearRepeat(ArrayList list) {

        ArrayList list2 = new ArrayList();// 创建一个新的集合

        Iterator it = list.iterator();// 获取迭代器
        while (it.hasNext()) {
            Book book = (Book) it.next();// 从旧集合中获取的元素
            if (!list2.contains(book)) {// 如果新集合没有包含该书籍,那么就存储到新集合中
                list2.add(book);
            }

        }
        return list2;

    }
}
### ArrayList 的使用方法和特性 #### 存储性能 ArrayList 是基于动态数组实现的列表[^2]。在底层,它使用一个数组来存储元素,并在需要时自动扩容。这种设计使得 ArrayList 在进行按索引访问时性能非常高,但在插入和删除操作上可能表现不如链表。 #### 特性 1. **动态扩容**:ArrayList 在添加新元素时,如果当前数组已满,它会创建一个更大的数组(通常是原大小的 1.5 倍),然后将原数组的元素复制到新数组中。这种机制虽然避免了频繁的扩容,但在进行大批量元素添加时,扩容操作可能导致性能下降。 2. **随机访问**:由于底层使用数组存储,ArrayList 支持通过索引直接访问元素,时间复杂度为 O(1),因此非常适合频繁的随机读取操作。 3. **顺序存储**:ArrayList 中元素的存储是连续的数组位置,任何中间位置的插入或删除操作都需要移动元素,因此插入或删除操作的时间复杂度为 O(n)[^2]。 #### 使用场景 ArrayList 非常适合需要频繁随机访问元素的场景,而不适合频繁进行插入和删除操作的场景。 #### 示例用法 以下是一个简单的 ArrayList 使用示例: ```java import java.util.ArrayList; public class ArrayListExample { public static void main(String[] args) { // 创建一个ArrayList ArrayList<String> list = new ArrayList<>(); // 添加元素 list.add("Apple"); list.add("Banana"); list.add("Cherry"); // 访问元素 System.out.println("Element at index 1: " + list.get(1)); // 插入元素 list.add(1, "Apricot"); System.out.println("List after insertion: " + list); // 删除元素 list.remove(2); System.out.println("List after deletion: " + list); // 检查元素是否存在 boolean containsBanana = list.contains("Banana"); System.out.println("List contains 'Banana': " + containsBanana); } } ``` #### 性能分析 - **查找操作**:通过索引访问的时间复杂度为 O(1),因为可以直接定位数组中的位置。 - **插入/删除操作**:在末尾添加元素的时间复杂度为 O(1),但在中间或头部插入/删除元素时,时间复杂度为 O(n),因为需要移动数组中的元素。 - **扩容开销**:当数组容量不够时,ArrayList 需要进行扩容操作,扩容的时间复杂度为 O(n),因为所有元素需要被复制到新的数组中。 #### 线程安全 ArrayList 不是线程安全的。如果需要线程安全的列表,可以使用 Vector 或者使用 Collections.synchronizedList 方法来包装 ArrayList。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值