应届生Java数组面试题

2025年3月16日 | 8分钟阅读

在Java中,数组是最重要的数据结构。它也被其他数据结构如HashTable、List等使用。从考试和面试的角度来看,它是Java中最重要的主题。

在本节中,我们涵盖了一些基于Java数组的重要面试题。这些问题通常在Java面试中被问到。如果你是应届生,这一节是为你准备的。阅读本节后,你将能够毫不犹豫地回答与数组相关的问题。

1) 数组在Java中创建在哪个内存区域?

数组由JVM在动态内存中创建。Java中没有静态内存的概念,一切(变量、数组、对象等)都只在动态内存中创建。


2) 我们可以从一个类调用另一个类的main()方法吗?

是的!我们可以通过类名.main()来调用另一个类的main()方法。在调用main()方法时,我们应该传递一个字符串类型的数组给它。


3) 什么是Java中的数组?

数组是同构数据元素的有限有序集合。它是有限的,因为它包含有限数量的元素。它是“有序的”,因为所有元素都以线性方式在一个接一个的计算机内存(堆)的连续位置存储。它是“同构的”,因为数组的所有元素都只具有相同的数据类型。我们可以存储原始类型或对象引用。


4) 数组有哪几种类型?

数组通常分为两类,如下所述

  • 一维数组
  • 多维数组(二维和三维数组)

5) 声明数组大小为负数是否可能?

不可以,声明数组大小为负数是不可能的。即使我们声明了负数大小,也不会有编译时错误。但我们会在运行时收到NegativeArraySizeException。


6) int array[] 和 int[] array 有什么区别?

array[] 和 []array 之间没有区别。array[] 和 []array 都是声明数组的方式。它们之间的唯一区别是,如果我们在一行声明多个数组,我们应该使用前缀[]。如果我们在一行声明一个数组,我们应该使用后缀[]。例如,考虑以下声明


7) 如何在Java中复制数组?

我们可以通过两种方式创建数组的副本:第一种是手动遍历数组,第二种是使用arrayCopy()方法。使用System类的arrayCopy()方法是复制数组最快的方式,并且允许我们复制数组的一部分。这两种方法是复制数组的常用方法。

复制数组的另外两种方法是使用Arrays.copyOf()方法和使用clone()方法。


8) 数组的默认值是什么?

当我们创建一个新数组时,它总是用默认值初始化。数组的默认值是

  • 如果数组是byte、short、int和long类型,默认值为0
  • 如果数组是float和double类型,默认值为0
  • 如果数组是Boolean类型,默认值为false
  • 如果数组是Object类型,默认值为null

9) 你对锯齿数组有什么理解?

锯齿数组(jagged array)是一种多维数组,其中成员数组的大小不同。例如,int array[][]=new int[3][]。这个语句创建了一个二维锯齿数组。


10) 什么是匿名数组,也举一个例子?

匿名数组是没有存储在变量中的数组引用。它用于构造其他对象。Java的Polygon类有一个构造函数,它解析匿名数组作为参数。

例如

上面的语句创建了一个匿名数组表示的三角形。


11) 有多少种方法可以在数组中查找重复元素?

在Java中,查找重复数组有以下五种方法。

  • 暴力法:在此方法中,我们将数组的每个元素与其他元素进行比较。如果发现任何两个元素相等,我们就认为它们是重复的。该方法的时间复杂度为O(n2)。
  • 使用HashSet:我们还可以使用HashSet类来查找数组中的重复元素。要查找重复元素,请迭代数组元素并调用HashSet类的add()方法将它们插入HashSet。如果方法返回false,则表示该元素已存在于Set中。查找重复元素需要O(n)时间。
  • 使用HashMap:我们知道HashMap使用键值对来存储元素。当我们使用HashMap查找重复数组时,我们将数组的元素作为键,元素的频率作为值。如果任何键的值大于1,则该键是重复元素。其时间和空间复杂度均为O(n)。使用此方法,我们还可以找到重复项的出现次数。

12) 可以在数组上执行哪些操作?

在数组上,我们可以执行查找、排序、遍历、删除和插入操作。


13) 考虑以下语句并说明声明是真还是假。同时,说明原因?

上述数组的声明是正确的。因为Java允许我们使用两种不同的特定于数组的语法快捷方式来初始化(将显式值放入数组的元素)和构造(实例化数组对象本身),在一个语句中。第一个语句用于声明、创建和初始化在一个语句中。第二个语句执行以下四项操作

  • 声明一个名为number的int数组引用变量。
  • 创建一个长度为五(五个元素)的int数组。
  • 填充数组的元素,值为12、34、90、56和65。
  • 新数组对象分配给引用变量number。

14) Set可以是一个数组吗?

在Java中,Set是一个数组,但数组不一定是Set。因为数组允许重复,但在Set中不允许。例如,考虑下图

Array Interview Questions in Java

15) 数组可以声明为volatile吗?

是的,我们可以在Java中使数组为volatile。但我们只能使指向数组的变量为volatile。如果通过替换单个元素来更改数组,那么volatile变量提供的保证将不成立。


16) 如果我们不分配大小就声明一个数组会发生什么?

声明一个没有大小的数组是不可能的。当我们不分配大小就声明一个数组时,它会抛出编译时错误。例如,height=new int[].


17) 数组大小可以声明为负数吗?

不可以,数组大小不能为负数。如果我们用负数大小声明数组,它会在运行时抛出NegativeArraySizeException。


18) 什么时候会发生ArrayIndexOutOfBoundsException?

当程序试图访问数组的索引时,会发生ArrayIndexOutOfBoundsException。当索引大于数组大小时,或者索引为负数时,也会发生此异常。


19) Arrays类中的哪个方法可用于在数组中搜索特定元素?

Arrays类中的binarySearch()方法用于在数组中搜索特定元素。该方法使用二分搜索算法。调用此方法之前,数组必须处于自然排序状态。这是在排序数组中查找元素的简单高效的方法。


20) 如何检索数组的类名?

数组是一个对象。从对象中我们可以检索类名。我们调用getClass()和getName()方法来检索数组的类名。getClass()是Object类的方法,它返回对象的运行时类。而getName()是Class类的方法,它返回类/数组类的名称。


21) Array和ArrayList有什么区别?

数组:数组是静态的。它是固定大小的。一旦声明,其大小就不能更改。它包含原始数据类型和类的对象。数组没有泛型功能。

ArrayList:ArrayList的大小是动态的。当我们将元素添加到其中时,其大小或容量会自动增长。它只包含对象条目。它具有泛型功能。


22) 我们如何检查数组是否包含值?

Java Arrays类提供了isExists()和contains()两个方法来检查数组是否包含元素。如果数组有元素,两个方法都返回true,否则返回false。


23) 什么是数组的平衡索引,也举一个例子?

如果较低索引的总和等于较高索引的总和,则称为数组的平衡索引。例如,考虑以下数组:[-7, 1, 5, 2, -4, 3, 0],其中

a[0]=-7, a[1]=1, a[2]=5, a[3]=2, a[4]=-4, a[5]=3, a[6]=0

让我们找到平衡索引。根据定义

较低索引的总和 = a[0]+a[1]+a[2] = -7+1+5 = -1

较高索引的总和 = a[4]+a[5]+a[6] = -4+3+0 = -1

我们观察到较低索引的总和等于较高索引的总和。因此,平衡索引是3。

在上面的数组中,6也是一个平衡索引,因为a[0]到a[5]的总和是0,而索引a[6]的值是0。


24) 什么是数组的左旋转?

左旋转是在数组上执行的操作。在此操作中,数组的每个元素向左移动1个单位。因此,最低索引的值移动到最高索引。我们可以对数组执行任意次数的旋转。它也称为循环数组。让我们对数组[7, 8, 9, 2, 5, 6]执行两次左旋转。

一次旋转后,我们得到数组[8, 9, 2, 5, 6, 7],两次旋转后,我们得到[9, 2, 5, 6, 8]


25) 数组有哪些优缺点?

数组优点

  • 我们可以用单个变量存储相同类型的多个元素。
  • 我们可以借助数组实现其他数据结构,如栈、队列、树等。
  • 我们可以在运行时通过索引获取数据元素。

数组缺点

  • 在使用数组之前,必须声明其大小。
  • 它是一个静态结构,所以我们不能增加或减少内存分配。
  • 插入和删除操作很困难,因为元素存储在连续的内存位置。这也会增加成本。
  • 分配比所需内存更多的内存是浪费内存。