基本信息
文件名称:Java数组面试题及答案(实战版).docx
文件大小:25.5 KB
总页数:5 页
更新时间:2025-09-25
总字数:约2.99千字
文档摘要

Java数组面试题及答案(实战版)

1.实际开发中,定义并初始化一个存储“用户年龄”的int数组,有哪几种常用写法?如果只声明不初始化,直接访问数组元素会出什么问题?

答案:

常用写法有3种,关键是要区分“声明”和“初始化”的区别:

①声明时直接赋值(最常用):

int[]userAges={18,22,30};//长度由赋值元素个数自动确定,不能先写长度再这么赋值(比如int[3]userAges={1,2,3}会报错)

②先指定长度,再逐个赋值:

int[]userAges=newint[3];

userAges[0]=18;

userAges[1]=22;

userAges[2]=30;//没赋值的元素会默认填0(int数组默认值)

③用new关键字+初始化块(少见,但面试可能问):

int[]userAges=newint[]{18,22,30};//这里new后面的[]不能写长度,否则和元素个数冲突

注意点:如果只声明不初始化(比如int[]userAges;),直接访问userAges[0]会报NullPointerException,因为此时数组变量只是个“空引用”,没指向实际内存空间。

2.我把数组A赋值给数组B后,修改B的元素,A的元素会跟着变吗?举个例子说明为什么?

答案:

会变!因为数组是引用类型,赋值传递的是“内存地址”,不是数组本身的拷贝。

比如这段代码:

int[]arrA={10,20};

int[]arrB=arrA;//arrB和arrA指向同一块内存

arrB[0]=99;//修改arrB,其实是改同一块内存里的值

System.out.println(arrA[0]);//输出99,arrA的元素也变了

如果想让A和B独立,需要手动拷贝数组(比如用System.arraycopy或Arrays.copyOf),而不是直接赋值。

3.实际开发中怎么给数组“扩容”?比如原有数组存满了,要加新元素,怎么做?

答案:

Java数组长度一旦初始化就固定,不能直接“扩”,只能用“新建数组+拷贝元素”的方式实现:

常用两种方法,以int数组为例:

①用Arrays.copyOf(简单,推荐):

int[]oldArr={1,2,3};

//新建一个长度为5的数组,把oldArr的元素拷贝过去,空位置填默认值0

int[]newArr=Arrays.copyOf(oldArr,5);

newArr[3]=4;//加新元素

newArr[4]=5;

②用System.arraycopy(效率高,底层常用):

int[]oldArr={1,2,3};

int[]newArr=newint[5];

//参数:源数组、源起始位置、目标数组、目标起始位置、拷贝长度

System.arraycopy(oldArr,0,newArr,0,oldArr.length);

newArr[3]=4;

newArr[4]=5;

(PS:ArrayList的动态扩容,底层就是这么实现的,只不过它帮我们封装了这个过程)

4.怎么判断一个数组里有没有某个元素?比如判断int数组里有没有“20”,有哪些方法?

答案:

分“无序数组”和“有序数组”两种情况,方法不一样:

①无序数组(最常用,不管数组是否排序):

直接遍历判断,或者用Arrays.asList转集合(注意基本类型数组转集合的坑):

int[]nums={15,20,25};

//方法1:遍历(简单直观)

booleanhas20=false;

for(intnum:nums){

if(num==20){

has20=true;

break;

}

}

//方法2:转集合(注意:int[]转List会变成Listint[],要先转Integer[])

Integer[]numObjArr=Arrays.stream(nums).boxed().toArray(Integer[]::new);

booleanhas20=Arrays.asList(numObjArr).contains(20);

②有序数组(如果数组已经排好序,用二分查找效率更高):

int[]sortedNums={15,20,25};//必须是有序的

intindex=Arra