Java中的Array和ArrayList
让我们在标题中简要讨论 数组 和 ArrayList 的概念,以后在Java程序中融入理解,然后进一步了解它们之间的区别。我们都知道,数组是提供在内存地址空间中连续添加元素的线性数据结构,而ArrayList是属于集合框架的类。作为一个优秀的编程者,不论知道这两者之间的区别,已经知道如何使用ArrayList而不是数组。即使使用ArrayList,在其中有一种功能,即可以传递数据类型的元素,无论是对象、字符串、整数、双精度浮点数、浮点数等。
注意: Java中的ArrayList可以看作是C++中的vector。
数组的创建方法
在Java中,以下是创建数组的两种不同方式。
- 简单的固定大小数组
- 动态大小数组
int arr[] = new int[10];
语法: 声明静态数组
它可以进一步分为两种类型:
- 类型1: 声明和初始化同时进行
- 类型2: 声明后初始化元素。
类型1
Type array_name[array_size];
Type array_name = { Element1,Element2,Element3,Element4,....,ElementN } ;
//如果我们有非常有限的数组元素,则更好
类型2
int arr [100];
// 这意味着我们声明了一个名为“arr”的内存块,
// 这个内存块包含了连续的100个关联块。
注意: arr(0)返回数组的第一个元素,这意味着如果我们试图打印arr(0),我们将得到Element1。这是非常重要的语句,当深入理解数组中的内存存储时,它不可避免地遗漏了。
现在让我们探讨ArrayList的下一个概念,如下所示
语法: 声明ArrayList
Arraylist<Type> al = new ArrayList<Type>();
//这里的Type是要创建的ArrayList中元素的类型
注意: Java中的ArrayList(相当于C++中的vector)具有动态大小。它可以根据需要缩小或扩展。 ArrayList是集合框架的一部分,存在于java.util包中。
现在让我们通过Array和ArrayList之间的区别举例说明
基础1: 数组是Java提供的一种基本功能。ArrayList是Java集合框架的一部分。因此,数组成员使用[]访问,而ArrayList具有一组访问元素并修改它们的方法。
例子:
// Java程序演示数组和ArrayList之间的区别。
// 导入所需的类。
import java.util.ArrayList;
import java.util.Arrays;
// 主类
class GFG {
// 主驱动方法
public static void main(String args[])
{
// 输入数组
int[] arr = new int[2];
arr[0] = 1;
arr[1] = 2;
// 打印数组的第一个元素
System.out.println(arr[0]);
// ArrayList
// 创建一个具有初始容量的arrayList,比如说它为2
ArrayList<Integer> arrL = new ArrayList<Integer>(2);
// 使用add()方法将元素添加到ArrayList中
arrL.add(1);
arrL.add(2);
// 打印并访问ArrayList的元素
System.out.println(arrL.get(0));
}
}
输出
1
1
基础2: 数组是固定大小的数据结构,而ArrayList则不是。在创建其对象时无需指定ArrayList的大小,即使我们指定了一些初始容量,我们仍然可以添加更多的元素。
示例:
// Java程序演示数组和ArrayList之间的区别。
// 导入所需的类。
import java.util.ArrayList;
import java.util.Arrays;
// 主类
class GFG {
// 主驱动方法
public static void main(String args[])
{
// 普通数组
// 需要为数组指定大小
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// 我们无法向数组arr[]中添加更多的元素
// ArrayList
// 不需要指定大小
// 声明一个Integer类型的ArrayList
ArrayList<Integer> arrL = new ArrayList<Integer>();
// 添加元素到ArrayList对象中
arrL.add(1);
arrL.add(2);
arrL.add(3);
arrL.add(4);
// 我们可以向arrL中添加更多的元素
// 打印和显示Arraylist的元素
System.out.println(arrL);
// 打印和显示array的元素
System.out.println(Arrays.toString(arr));
}
}
输出
[1, 2, 3, 4]
[1, 2, 3]
基础3: 数组可以包含基本数据类型以及根据数组定义的类的对象。但是,ArrayList只支持对象条目,而不支持基本数据类型。
注意: 当我们执行arraylist.add(1)时,它将基本的int数据类型转换为Integer对象,如下例所示。
示例:
import java.util.ArrayList;
class Test
{
public static void main(String args[])
{
// allowed
int[] array = new int[3];
// allowed, however, need to be initialized
Test[] array1 = new Test[3];
// not allowed (Uncommenting below line causes
// compiler error)
// ArrayList<char> arrL = new ArrayList<char>();
// 允许以下内容
ArrayList<Integer> arrL1 = new ArrayList<>();
ArrayList<String> arrL2 = new ArrayList<>();
ArrayList<Object> arrL3 = new ArrayList<>();
System.out.println("成功编译并执行");
}
}
输出
成功编译并执行
基础4: 由于ArrayList无法为原始数据类型创建,因此ArrayList的成员始终是指向不同内存位置处对象的引用(详见此处)。因此,在ArrayList中,实际对象从未存储在连续的位置上。实际对象的引用存储在连续的位置上。
另一方面,对于数组,它取决于数组是原始类型还是对象类型。对于原始类型,实际值以连续的位置存储,但对于对象,分配与ArrayList类似。Java ArrayList支持许多其他操作,如indexOf()、remove()等,而这些函数不受数组支持。
我们已经实现并看到了它们之间的差异,从输出中可知。现在,让我们通过以下表格形式绘制确定性的差异来结束文章:
| 基础 | 数组 | ArrayList |
|---|---|---|
| 维数 | 可以是单维或多维的 | 只能是单维的 |
| 遍历元素 | 使用for和for each一般用于数组迭代。 | 这里使用iterator来遍历ArrayList。 |
| 长度 | length关键字可以给出数组的总大小。 | size()方法用于计算ArrayList的大小。 |
| 大小 | 它是静态的,长度固定 | 它是动态的,大小可以在需要时增加或减小。 |
| 速度 | 它更快,因为它是固定大小的。 | 它相对较慢,因为它是动态的。 |
| 原始数据类型存储 | 原始数据类型可以直接存储,而不像对象那样添加。 | 原始数据类型不能直接添加,需要通过自动装箱和拆箱等帮助间接添加。 |
| 泛型 | 不能在此添加,因此不安全 | 可以在此添加,从而使ArrayList类型安全。 |
| 添加元素 | 赋值操作符仅起到作用。 | 这里使用了一种特殊的方法,称为add()方法。 |
极客教程