Java 数组与ArrayList

Java 数组与ArrayList

让我们在标题中简要地讨论一下 数组ArrayList 的概念,以便在以后的java程序中加入对它们的理解,从而了解它们之间的最终区别。我们都知道,数组是线性数据结构,提供在内存地址空间中连续添加元素的功能,而ArrayList是属于集合框架的一个类。作为一个优秀的程序员,尽管知道这两者之间的区别,但已经知道使用ArrayList而不是数组。现在,即使是ArrayList,也有一个功能,可以传递存储在ArrayList中的元素的数据类型,无论是对象、字符串、整数、双数、浮点数等。

注意: 作为一个附带说明,Java中的ArrayList可以被看作是类似于C++中的向量。

创建数组的方法

在Java中,以下是创建数组的两种不同方法。

  1. 简单的固定大小的数组
  2. 动态大小的数组
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()方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程