Java 数组与ArrayList
让我们在标题中简要地讨论一下 数组 和 ArrayList 的概念,以便在以后的java程序中加入对它们的理解,从而了解它们之间的最终区别。我们都知道,数组是线性数据结构,提供在内存地址空间中连续添加元素的功能,而ArrayList是属于集合框架的一个类。作为一个优秀的程序员,尽管知道这两者之间的区别,但已经知道使用ArrayList而不是数组。现在,即使是ArrayList,也有一个功能,可以传递存储在ArrayList中的元素的数据类型,无论是对象、字符串、整数、双数、浮点数等。
注意: 作为一个附带说明,Java中的ArrayList可以被看作是类似于C++中的向量。
创建数组的方法
在Java中,以下是创建数组的两种不同方法。
- 简单的固定大小的数组
- 动态大小的数组
int arr[] = new int[10];
语法: 声明一个静态数组
它可以由两种类型进一步定义。
- 类型1 :同时声明和初始化
- 类型2: 声明后再初始化元素。
类型1
Type array_name [array_size] ;
Type array_name = { Element1, Element2, Element3, Element4,...., ElementN } ;
// It is preferable if we have very limited array elements
类型2
int arr [100] ;
// This does means we are declaring a memory block named 'arr'
// which is containing continuous 100 block associated in it
注意: arr(0)返回数组的第一个元素,所以它确实意味着如果我们试图打印出arr(0),那么我们将得到Element1。这是非常重要的声明,当涉及到对数组中的内存存储的深入理解时,它是不可避免的。
现在让我们来看看ArrayList的下一个概念,如下所示
语法: 声明一个数组列表
Arraylist<Type> al = new ArrayList<Type>();
// Here Type is the type of elements in ArrayList to be created
注意: Java中的ArrayList(相当于C++中的向量)具有动态大小。它可以根据大小缩减或扩展。ArrayList是集合框架的一部分,存在于java.util包中。
现在让我们借助Array和ArrayList之间的区别来举例说明
基础1: 数组是Java提供的一个基本功能。ArrayList是Java中集合框架的一部分。因此,数组成员是用[]来访问的,而ArrayList有一组方法来访问元素和修改它们。
例子
// Java program to demonstrate differences between
// Array and ArrayList
// Importing required classes
import java.util.ArrayList;
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Input array
int[] arr = new int[2];
arr[0] = 1;
arr[1] = 2;
// Printing first element of array
System.out.println(arr[0]);
// ArrayList
// Creating an arrayList with initial capacity
// say bi it 2
ArrayList<Integer> arrL = new ArrayList<Integer>(2);
// Adding elements to ArrayList
// using add() method
arrL.add(1);
arrL.add(2);
// Printing alongside accessing
// elements of ArrayList
System.out.println(arrL.get(0));
}
}
输出
1
1
基础2: 数组是一个固定大小的数据结构,而ArrayList不是。在创建ArrayList对象时,我们不需要提及ArrayList的大小。即使我们指定了一些初始容量,我们也可以添加更多的元素。
例子
// Java program to demonstrate differences between
// Array and ArrayList
// Importing required classes
import java.util.ArrayList;
import java.util.Arrays;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Normal Array
// Need to specify the size for array
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// We cannot add more elements to array arr[]
// ArrayList
// Need not to specify size
// Declaring an Arraylist of Integer type
ArrayList<Integer> arrL = new ArrayList<Integer>();
// Adding elements to ArrayList object
arrL.add(1);
arrL.add(2);
arrL.add(3);
arrL.add(4);
// We can add more elements to arrL
// Print and display Arraylist elements
System.out.println(arrL);
// Print and display array elements
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>();
// Allowed
ArrayList<Integer> arrL1 = new ArrayList<>();
ArrayList<String> arrL2 = new ArrayList<>();
ArrayList<Object> arrL3 = new ArrayList<>();
System.out.println("Successfully compiled and executed");
}
}
输出
Successfully compiled and executed
基础4: 由于ArrayList不能为原始数据类型创建,ArrayList的成员总是对不同内存位置的对象的引用(详见此)。因此,在ArrayList中,实际的对象永远不会被存储在连续的位置。实际对象的引用被存储在连续的位置上。
另一方面,在数组中,这取决于数组是原始类型还是对象类型。在原始类型的情况下,实际值是连续的位置,但在对象的情况下,分配与ArrayList类似。Java ArrayList支持许多额外的操作,如indexOf(), remove()等。这些功能是数组不支持的。
我们已经实现并看到了它们之间的差异,这是从输出中感知到的。现在,让我们以表格的形式来总结这篇文章,如下图所示的结论性的差异。
| 项目 | Array | ArrayList |
|---|---|---|
| 维度 | 它可以是单维的,也可以是多维的 | 它只能是单维的 |
| 遍历元素 | For和for each一般用于遍历数组。 | 这里迭代器被用来遍历riverArrayList。 |
| 长度 | length关键字可以给出数组的总大小。 | size()方法用于计算ArrayList的大小。 |
| 大小 | 它是静态的,有固定的长度 | 它是动态的,可以在需要时增加或减少大小。 |
| 速度 | 它的速度较快,因为上面我们看到它是固定大小的。 | 由于它的动态性质,它的速度相对较慢。 |
| 原始数据类型存储 | 原始数据类型可以直接存储在不可能的对象中 | 原始数据类型不能直接添加到不可能的数组中,它们是在自动装箱和拆箱的帮助下间接添加的。 |
| 通用型 | 它们不能被添加到这里,因此类型不安全 | 它们可以被添加到这里,因此使ArrayList成为类型安全的。 |
| 添加元素 | 赋值运算符只起到了这个作用 | 这里使用了一个特殊的方法,即add()方法。 |
极客教程