一、概念
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);
}
}
}
四、与普通数组的区别(既生瑜何生亮)
-
大小:普通数组一旦创建,其大小就是固定的,不能再改变。而ArrayList是动态的,可以自动增长和缩小以适应我们添加或删除元素的需要。
-
类型:普通数组可以存储任何类型的数据,包括基本类型和对象。而ArrayList只能存储对象,不能直接存储基本类型(不过,Java的自动装箱和拆箱特性允许我们在ArrayList中使用基本类型)。
-
功能:ArrayList类提供了许多内置的方法,如add(), remove(), get(), set()等,使用起来非常方便。而在普通数组中,我们需要手动编写代码来实现这些操作。
-
性能:由于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的内置方法可以使我们的代码更简洁,更易于理解和维护。
-
迭代: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); } } }
-
线程安全:ArrayList是非线程安全的,而数组是线程安全的。
以上就是普通数组和ArrayList的主要区别。
基本概念:
1.而Java集合框架提供了一套预定义的类和接口,用于存储和处理数据集。
Java集合框架主要包含两种类型的接口:Collection和Map。
Collection接口下又包含了List、Set和Queue接口,它们的实现类有:
- List接口:ArrayList、LinkedList、Vector、Stack等。
- Set接口:HashSet、LinkedHashSet、TreeSet等。
- Queue接口:PriorityQueue、LinkedList、ArrayDeque等。
Map接口是另一种主要的集合类型,它存储键值对(key-value pairs)。Map的主要实现类有:
- HashMap
- LinkedHashMap
- TreeMap
- 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中使用基本类型。