本教程使用代码示例介绍如何声明,初始化和打印Java ArrayList。您还将了解Java的2D Arraylist和ArrayList的实现:


ArrayList是数据结构,是Collections Framework的一部分,可以看作类似于数组和向量。

ArrayList可以看作是动态数组,它使您可以随时或简单地说动态地添加或删除元素。

换句话说,它的大小可以动态增加或减少,这与数组的大小一旦声明就保持静态是不同的。

Java中的ArrayList类

Java中的ArrayList数据结构由ArrayList类表示,该类是“ java.util ”包的一部分。

ArrayList类的层次结构如下所示。

java 动态生成列名 java声明列表_初始化

如您所见,ArrayList类实现了List接口,该接口又从Collection接口扩展而来。

ArrayList类的一般定义如下:

public class ArrayList<E>
extends AbstractList<E>
implements List<E>,RandomAccess, Cloneable, Serializable

以下是ArrayList的一些区别特征:

  • Java的ArrayList类通过维护插入顺序来存储元素。
  • ArrayList允许在其中存储重复的元素。
  • ArrayList不同步,这是区分ArrayList和Java中的Vector类的要点。
  • Java中的ArrayList与C ++中的Vectors更加相同。
  • Java中的ArrayList还使用数组之类的索引,并支持随机访问。
  • ArrayList中元素的操作很慢,因为如果要从ArrayList中删除任何元素,则需要进行许多元素移位。
  • ArrayList类不能包含基本类型,而只能包含对象。在这种情况下,我们通常将其称为“对象的ArrayList”。因此,如果要存储元素的整数类型,则必须使用包装器类的Integer对象,而不要使用原始类型int。

创建并声明ArrayList

为了在程序中使用ArrayList类,您需要首先使用“ import”指令将其包括在程序中,如下所示:


import java.util.ArrayList;

要么


import java.util.*;     //this will include all classes from java.util package


将ArrayList类导入程序后,就可以创建ArrayList对象。

常规ArrayList创建语法为:

ArrayList <data_type> arrayList = new ArrayList <>();

除了上述使用默认构造函数的语句之外,ArrayList类还提供了其他可重载的构造函数,可用于创建ArrayList。

构造方法

Java中的ArrayList类提供以下构造函数方法来创建ArrayList。

方法1:ArrayList()

此方法使用ArrayList类的默认构造函数,并用于创建一个空的ArrayList。

此方法的一般语法为:

ArrayList <数据类型>列表名称=new ArrayList <>();

例如,您可以使用以下语句创建String类型的通用ArrayList。


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



这将创建一个名为String的空ArrayList,名称为“ arraylist”。

方法2:ArrayList(整数容量)

此重载的构造函数可用于创建具有指定大小或容量(作为构造函数的参数提供)的ArrayList。

此方法的一般语法为:

ArrayList <数据类型>列表名称=new ArrayList <>(int容量);

例:


ArrayList<Integer> arraylist = new ArrayList<>(10);



上面的语句创建一个空的ArrayList,名称为'arraylist',类型为Integer,容量为10。

方法3:ArrayList(Collection <?扩展E> c)

ArrayList类的第三个重载构造函数将一个已经存在的集合作为参数,并使用指定集合c中的元素作为其初始元素创建一个ArrayList。

使用此构造函数初始化ArrayList的一般语法为:

ArrayList <数据类型>列表名称=new ArrayList <>(集合c)

例如,如果intList是一个包含元素{10,20,30,40,50}的现有集合,则以下语句将创建一个列表'arraylist',并将intList的内容作为其初始元素。


ArrayList<Integer> ArrayList = new ArrayList<>(intList);


ArrayList类还支持各种可用于操作列表内容的方法。我们将在即将到来的教程“ Java中的ArrayList方法”中详细讨论这些方法。

用Java初始化ArrayList

创建ArrayList后,可以通过多种方法用值初始化ArrayList。在本节中,我们将讨论这些方式。

#1)使用Arrays.asList

在这里,您可以使用Arrays类的asList方法传递一个转换为List的Array,以初始化ArrayList。

通用语法:


ArrayList<data_type> arrayListName = new ArrayList<data_type>(
            Arrays.asList (Object o1, Object o2, …, Object on));

例:


import java.util.*;
 
public class Main {
   public static void main(String args[]) {
      //create and initialize ArrayList object myList with Arrays.asList method
     ArrayList<String> myList = new ArrayList<String>(
     Arrays.asList("One", "Two", "Three"));
     //print the ArrayList
     System.out.println("List contents:"+myList);
   }
}


输出:

java 动态生成列名 java声明列表_Java_02

#2)使用匿名内部类方法

在这里,我们使用匿名内部类将ArrayList初始化为值。

使用匿名内部类进行ArrayList初始化的一般语法如下:

ArrayList <数据类型> arraylistName =new ArrayList <数据类型>(){{
			add(对象o1); add(对象o2);…
			add(对象);}};

例:

import java.util.*;
public class Main {
   public static void main(String args[]) {
       //create and initialize ArrayList with anonymous inner class calls
       ArrayList<String> colors = new ArrayList<String>(){{
        add("Red");
        add("Blue");
        add("Purple");
           }};
      //print the ArrayList
    System.out.println("Content of ArrayList:"+colors);
   }
}


输出:

java 动态生成列名 java声明列表_java 动态生成列名_03

#3)使用添加方法

这是将元素添加到任何集合的常用方法。

使用add方法将元素添加到ArrayList的一般语法为:

ArrayList <数据类型> ArraylistName =new ArrayList <数据类型>();
ArraylistName.add(value1);
ArraylistName.add(value2);
ArraylistName.add(value3);

编程实例:


import java.util.*;
public class Main {
   public static void main(String args[]) {
       //create ArrayList
       ArrayList<String> colors = new ArrayList<String>();
       //add elements to the ArrayList using add method
       colors.add("Red");
       colors.add("Green");
       colors.add("Blue");
       colors.add("Orange");
       //print the ArrayList
       System.out.println("Content of ArrayList:"+colors);
   }



输出:

java 动态生成列名 java声明列表_java 动态生成列名_04

#4)使用Collection.nCopies方法

此方法用于使用相同的值初始化ArrayList。我们提供要初始化的元素数和该方法的初始值。

初始化的一般语法为:

ArrayList <数据类型> arrayListName =new 				
	ArrayList <数据类型>(Collections.nCopies(count,element));

下面的示例演示了使用Collections.nCopies方法进行的数组初始化。

import java.util.*;
public class Main {
   public static void main(String args[]) {
       //create ArrayList with 10 elements
       //initialized to value 10 using Collections.nCopies
       ArrayList<Integer> intList = new ArrayList<Integer>(Collections.nCopies(10,10));
     
      //print the ArrayList
    System.out.println("Content of ArrayList:"+intList);
   }
}

输出:

java 动态生成列名 java声明列表_初始化_05

遍历ArrayList

我们有以下几种方式遍历或遍历ArrayList:

  1. 使用for循环
  2. 通过for-each循环(增强的for-loop)。
  3. 使用Iterator界面。
  4. 通过ListIterator接口。
  5. 通过forEachRemaining()方法。

实际上,通常使用这些方法来遍历集合。在本教程中,我们将看到与ArrayList有关的每种方法的示例。

#1)使用for循环

基于索引的for循环可用于遍历ArrayList并打印其元素。

以下是使用for循环遍历和打印ArrayList的示例。

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        //create a list
        List<Integer> intList  = new ArrayList<>();
        intList.add(10);
        intList.add(20);
        intList.add(30);
        intList.add(40);
        intList.add(50);
       //create & initialize a new ArrayList with previous list
        ArrayList<Integer> arraylist = new ArrayList<>(intList);
        System.out.println("Contents of ArrayList using for-loop:");
        //use for loop to traverse through its elements and print it
        for(int i=0;i<intList.size();i++){
               System.out.print(intList.get(i) + " ");
        }
    }
}


输出:

java 动态生成列名 java声明列表_Java_06

这是遍历和打印ArrayList元素的最简单,最简单的方法,在其他集合的情况下也是如此。

#2)通过for-each循环(增强的for循环)

您也可以使用for-each循环或增强的for循环遍历ArrayList。在Java 8之前,它不包含lambda表达式。但是从Java 8开始,您还可以在for-each循环中包括Lambda表达式。

下面的程序演示了对每个循环和lambda表达式使用ArrayList的遍历和打印。


import java.util.*;
public class Main
{
    public static void main(String[] args) {
        //create a list
        List<Integer> intList  = new ArrayList<>();
        intList.add(10);
        intList.add(20);
        intList.add(30);
        intList.add(40);
        intList.add(50);
       //create & initialize a new ArrayList with previous list
        ArrayList<Integer> arraylist = new ArrayList<>(intList);
        System.out.println("Contents of ArrayList using for-each loop:");
       //use for-each loop to traverse through its elements and print it
         intList.forEach(val ->{
       System.out.print(val + " ");
        });
      }
}


输出:

java 动态生成列名 java声明列表_初始化_07

#3)使用迭代器接口

在前面的主题中,我们已经详细了解了Iterator接口。迭代器接口可用于遍历ArrayList并打印其值。

以下程序显示了这一点。

import java.util.*;
 
public class Main
{
    public static void main(String[] args) {
        //create a list
        List<Integer> intList  = new ArrayList<>();
        intList.add(5);
        intList.add(10);
        intList.add(15);
        intList.add(20);
        intList.add(25);
        //create & initialize a new ArrayList with previous list
        ArrayList<Integer> arraylist = new ArrayList<>(intList);
       System.out.println("Contents of ArrayList using Iterator interface:");
     //Traverse through the ArrayList using iterator
    Iterator iter=arraylist.iterator(); 
       while(iter.hasNext()){ 
            System.out.print(iter.next() + " "); 
       } 
       }
}

输出:

java 动态生成列名 java声明列表_初始化_08

#4)通过ListIterator接口

您还可以使用ListIterator遍历ArrayList。ListIterator可用于向前和向后遍历ArrayList。

让我们实现一个Java程序,该程序演示一个使用ListIterator的示例。


import java.util.*; 
class Main{ 
  public static void main(String args[]){ 
    //create a list and initiliaze it
    List<String> colors_list=new ArrayList<String>();//Creating arraylist
    colors_list.add("Red"); 
    colors_list.add("Green"); 
    colors_list.add("Blue"); 
    colors_list.add("Cyan");
    colors_list.add("Magenta");
    colors_list.add("Yellow");
    System.out.println("The contents of the list using ListIterator:");
    //Traverse the list using ListIterator
   ListIterator<String> color_iter=colors_list.listIterator(colors_list.size()); 
      while(color_iter.hasPrevious()) 
        { 
            String str=color_iter.previous(); 
            System.out.print(str + " "); 
        }   
 } 
} 


输出:

java 动态生成列名 java声明列表_初始化_09

从输出中可以看到,在上面的程序中,使用ListIterator的hasPrevious()和previous()方法向后遍历ArrayList。

#5)通过forEachRemaining()方法

这是遍历ArrayList的方法之一,自Java 8起可用。

下面的程序演示了遍历ArrayList的forEachRemaining()方法。



import java.util.*; 
class Main{ 
  public static void main(String args[]){ 
    //create a list and initiliaze it
    List<String> colors_list=new ArrayList<String>(); 
    colors_list.add("Red"); 
    colors_list.add("Green"); 
    colors_list.add("Blue"); 
    colors_list.add("Cyan");
    colors_list.add("Magenta");
    colors_list.add("Yellow");
    System.out.println("The contents of the list using forEachRemaining() method:");
    //Traverse the list using forEachRemaining () method
    Iterator<String> itr=colors_list.iterator(); 
        itr.forEachRemaining(val-> //lambda expression 
          { 
            System.out.print(val + " "); 
          }); 
 } 
}



输出:

java 动态生成列名 java声明列表_初始化_10

我们将forEachRemaining()方法与Iterator一起使用。它与每个相似,我们在此方法内部使用lambda表达式。

ArrayList Java示例

在本节中,我们将看到Java中的ArrayList实现。作为示例,我们将通过创建,初始化和使用Java ArrayList执行各种操作来实现一个完整的示例。



import java.util.ArrayList;
class Main {
   public static void main(String[] args) {
    //Creating a generic ArrayList
    ArrayList<String> newList = new ArrayList<String>();
    //Size of arrayList
    System.out.println("Original size of ArrayList at creation: " + newList.size());
    //add elements to it
    newList.add("IND");
    newList.add("USA");
    newList.add("AUS");
    newList.add("UK");
 
    //print the size after adding elements
    System.out.println("ArrayList size after adding elements: " + newList.size());
 
    //Print ArrayList contents
    System.out.println("Contents of the ArrayList: " + newList);
 
    //Remove an element from the list
    newList.remove("USA");
    System.out.println("ArrayList contents after removing element(USA): " + newList);
 
    //Remove another element by index
    newList.remove(2);
    System.out.println("ArrayList contents after removing element at index 2: " + newList);
 
    //print new size
    System.out.println("Size of arrayList: " + newList.size());
    //print list contents
    System.out.println("Final ArrayList Contents: " + newList);
 }
}


输出:

java 动态生成列名 java声明列表_java_11

Java中的二维ArrayList

我们知道ArrayList没有像Arrays这样的维度。但是我们可以嵌套ArrayList,也称为“ 2D ArrayLists”或“ ArrayLists的ArrayList”。

这些嵌套的ArrayList背后的简单思想是,给定一个ArrayList,此ArrayList的每个元素都是另一个ArrayList。

让我们使用以下程序了解这一点。


import java.util.*;
public class Main {
   public static void main(String[] args)  {
         int num = 3;
        // declare an arrayList of ArrayLists or 2D ArrayList
        ArrayList<ArrayList<Integer>> intList = 
               new ArrayList<ArrayList<Integer>>(num);
 
        // Create individual elements or ArrayLists and add them to intList as elements
        ArrayList<Integer> list_elem1 = new ArrayList<Integer>();
        list_elem1.add(10);
        intList.add(list_elem1);
 
        ArrayList<Integer> list_elem2 = new ArrayList<Integer>();
        list_elem2.add(20);
        list_elem2.add(30);
        intList.add(list_elem2);
 
        ArrayList<Integer> list_elem3 = new <Integer>();
        list_elem3.add(40);
        list_elem3.add(50);
        list_elem3.add(60);
        intList.add(list_elem3);
 
        System.out.println("Contents of 2D ArrayList(Nested ArrayList):");
        //print the 2D ArrayList or nested ArrayList
       for (int i = 0; i <intList.size(); i++) {
           for (int j = 0; j <intList.get(i).size(); j++) {
                 System.out.print(intList.get(i).get(j) + " ");
            }
         System.out.println();
        }
    }
}



输出:

java 动态生成列名 java声明列表_初始化_12

上面的程序显示了2D ArrayList。在这里,首先,我们声明一个ArrayLists的ArrayList。然后,我们定义单独的ArrayList,将每个ArrayList添加到嵌套ArrayList时,它们将作为嵌套ArrayList的各个元素。

要访问ArrayList的每个元素,我们需要调用get方法两次。首先访问嵌套ArrayList的行,然后访问行和列的各个交集。

请注意,您可以增加ArrayList的嵌套级别来定义多维ArrayList。例如, 3D ArrayList将具有2D ArrayLists作为其元素,依此类推。

经常问的问题

Q#1)Java中的ArrayList是什么?

答: Java中的ArrayList是动态数组。它本质上是可调整大小的,即在添加新元素时会增加大小,而在删除元素时会缩小。

Q#2)Array和ArrayList有什么区别?

答:数组为静态结构,声明后就无法更改其大小。ArrayList是动态数组,在添加或删除元素时会更改其大小。

数组是Java中的基本结构,而ArrayList是Java中Collection Framework的一部分。另一个区别是,虽然Array使用下标([])访问元素,但ArrayList使用方法访问其元素。

Q#3)ArrayList是一个列表吗?

答: ArrayList是列表的子类型。ArrayList是一个类,而List是一个接口。

Q#4)ArrayList是集合吗?

答:不能。ArrayList是Collection的实现,后者是一个接口。

Q#5)ArrayList如何增加其大小?

答:内部ArrayList被实现为Array。ArrayList有一个size参数。将元素添加到ArrayList并达到size值时,ArrayList在内部添加另一个数组以容纳新元素。

结论

这是有关Java ArrayList类基础知识的教程。我们已经看到了ArrayList类的创建和初始化以及ArrayList的详细编程实现。

我们还讨论了2D和多维ArrayList。ArrayList类支持各种可用于操作元素的方法。在我们即将发布的教程中,我们将介绍这些方法。