深入学习ArrayList

本文详细介绍了Java中的ArrayList,包括其概念、作用、基本操作以及与普通数组的区别,特别强调了ArrayList作为泛型类的特点,以及如何通过自动装箱和拆箱处理基本类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

        ArrayList是Java集合框架(Java Collection Framework)中的一部分。

        是实现了List接口的动态数组。所以它具有List接口的所有特性。

        可以根据需要自动增加大小,允许我们存储不同类型的对象,包括null。

 二、作用

        1.存储数据:ArrayList可以存储任何类型的对象。

ArrayList<Integer> intList = new ArrayList<Integer>(); // 存储Integer对象
ArrayList<String> strList = new ArrayList<String>(); // 存储String对象
ArrayList<List<Integer>> listOfList = new ArrayList<List<Integer>>(); // 存储List对象

        2.可以包含重复和null元素:ArrayList允许存储重复的元素和null值。

ArrayList<String> list = new ArrayList<String>();

// 添加重复元素
list.add("Hello");
list.add("Hello");

// 添加null元素
list.add(null);

System.out.println(list); // 输出:[Hello, Hello, null]

        3.插入顺序:ArrayList保持元素的插入顺序,这意味着元素会按照它们被添加到ArrayList中的顺序进行存储。

        4.动态扩展:ArrayList的大小可以动态改变,当我们添加或删除元素时,它会自动调整其大小。  
        5.随机访问:由于ArrayList是基于数组的,所以我们可以直接通过索引访问元素,这使得访问速度非常快。

        6.操作:ArrayList提供了大量的方法来操作列表,例如添加、删除、查找、排序和替换元素等。

总的来说,ArrayList是一个非常灵活和强大的数据结构,它可以满足大多数需要动态数组的情况。

三、基本操作

// 导入ArrayList类
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // 创建一个ArrayList
        ArrayList<String> list = new ArrayList<String>();

        // 添加元素
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 打印ArrayList的大小
        System.out.println("ArrayList的大小: " + list.size());

        // 获取并打印ArrayList的元素
        for (int i = 0; i < list.size(); i++) {
            System.out.println("索引 " + i + " 的元素: " + list.get(i));
        }

        // 删除一个元素
        list.remove(1);

        // 打印删除元素后的ArrayList
        System.out.println("删除元素后的ArrayList: " + list);

        // 检查一个元素是否在ArrayList中
        if (list.contains("Banana")) {
            System.out.println("Banana在ArrayList中");
        } else {
            System.out.println("Banana不在ArrayList中");
        }
    }
}

ArrayList允许我们存储不同类型的对象

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // 创建一个ArrayList
        ArrayList<Object> list = new ArrayList<Object>();

        // 添加不同类型的元素
        list.add("Apple");
        list.add(123);
        list.add(null);
        list.add(45.67);
        list.add(true);

        // 打印ArrayList
        for (Object obj : list) {
            System.out.println(obj);
        }
    }
}

四、与普通数组的区别(既生瑜何生亮)

  1. 大小:普通数组一旦创建,其大小就是固定的,不能再改变。而ArrayList是动态的,可以自动增长和缩小以适应我们添加或删除元素的需要。

  2. 类型:普通数组可以存储任何类型的数据,包括基本类型和对象。而ArrayList只能存储对象,不能直接存储基本类型(不过,Java的自动装箱和拆箱特性允许我们在ArrayList中使用基本类型)。

  3. 功能:ArrayList类提供了许多内置的方法,如add(), remove(), get(), set()等,使用起来非常方便。而在普通数组中,我们需要手动编写代码来实现这些操作。

  4. 性能:由于ArrayList是基于数组实现的,并且每次添加或删除元素都可能需要复制数组,所以在处理大量数据时,ArrayList可能会比普通数组慢一些。

    import java.util.ArrayList;
    
    public class Test {
        public static void main(String[] args) {
            // 创建ArrayList
            ArrayList<String> list = new ArrayList<String>();
    
            // 使用add()方法添加元素
            list.add("Hello");
            list.add("World");
    
            // 使用get()方法获取元素
            String firstElement = list.get(0); // Hello
            String secondElement = list.get(1); // World
    
            // 使用set()方法设置元素
            list.set(1, "囝囝");
    
            // 使用remove()方法删除元素
            list.remove(0);
    
            // 打印ArrayList
            System.out.println(list); // 输出:[囝囝]
        }
    }

    在普通数组中, 需要手动书写

    public class Test {
        public static void main(String[] args) {
            // 创建数组
            String[] array = new String[2];
    
            // 添加元素
            array[0] = "Hello";
            array[1] = "World";
    
            // 获取元素
            String firstElement = array[0]; // Hello
            String secondElement = array[1]; // World
    
            // 设置元素
            array[1] = "囝囝";
    
            // 删除元素(实际上是创建一个新数组,不包含要删除的元素)
            String[] newArray = new String[array.length - 1];
            for (int i = 0, j = 0; i < array.length; i++) {
                if (i != 0) {
                    newArray[j++] = array[i];
                }
            }
            array = newArray;
    
            // 打印数组
            for (String s : array) {
                System.out.println(s); // 输出:囝囝
            }
        }
    }
    可以看到,使用ArrayList的内置方法可以使我们的代码更简洁,更易于理解和维护。
    

  5. 迭代:ArrayList可以使用迭代器进行迭代,也可以使用for循环和foreach循环,这使得ArrayList在迭代方面比普通数组更加灵活。而普通数组可以使用for循环或者foreach循环进行迭代。

    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Test {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<String>();
            list.add("Hello");
            list.add("World");
    
            // 使用迭代器进行迭代
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }
    public class Test {
        public static void main(String[] args) {
            String[] array = new String[] {"Hello", "World"};
    
            // 使用for循环进行迭代
            for (int i = 0; i < array.length; i++) {
                System.out.println(array[i]);
            }
    
            // 使用foreach循环进行迭代
            for (String str : array) {
                System.out.println(str);
            }
        }
    }

  6. 线程安全:ArrayList是非线程安全的,而数组是线程安全的。

以上就是普通数组和ArrayList的主要区别。

基本概念:

1.而Java集合框架提供了一套预定义的类和接口,用于存储和处理数据集。

Java集合框架主要包含两种类型的接口:Collection和Map。

Collection接口下又包含了List、Set和Queue接口,它们的实现类有:

  1. List接口:ArrayList、LinkedList、Vector、Stack等。
  2. Set接口:HashSet、LinkedHashSet、TreeSet等。
  3. Queue接口:PriorityQueue、LinkedList、ArrayDeque等。

Map接口是另一种主要的集合类型,它存储键值对(key-value pairs)。Map的主要实现类有:

  1. HashMap
  2. LinkedHashMap
  3. TreeMap
  4. Hashtable

此外,还有一些特殊的集合类,如枚举类Enumeration、迭代器类Iterator和列表迭代器ListIterator等。这些类和接口提供了丰富的操作来处理数据集,包括添加、删除、查找、排序、迭代等。

2.ArrayList作为泛型类,应该注意什么

        ArrayList是一个泛型类,它只能存储对象,不能直接存储基本类型。这是因为Java的泛型机制不支持基本类型。

ArrayList<int> list = new ArrayList<int>(); // 错误,不能使用基本类型

但是,Java提供了一个特性叫做自动装箱和拆箱,它允许我们在需要对象的地方使用基本类型。当我们将基本类型添加到ArrayList时,Java会自动将该基本类型转换(装箱)为对应的包装类对象。例如,int会被转换为Integer,double会被转换为Double等。同样,当我们从ArrayList中获取元素时,如果该元素是一个包装类对象,Java会自动将其转换(拆箱)为对应的基本类型。

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(123); // 自动装箱,实际上添加的是一个Integer对象
int num = list.get(0); // 自动拆箱,实际上获取的是一个Integer对象,但自动转换为int类型

尽管ArrayList不能直接存储基本类型,但通过自动装箱和拆箱,我们可以方便地在ArrayList中使用基本类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值