java的数组,2021年上半年最接地气的Java面经

    int[] array = { 1, 2, 3, 4, 5 };

    // 依次使用数组中的每一个元素, 给迭代变量进行赋值。

    // 此时, 数组中的每一个元素依次给 element 进行赋值。

    for (int element : array) {

    	System.out.println(element);

	}

}

}




**两种方式的对比**



如果需要在遍历的同时, 获取到数组中的元素下标, 需要使用下标遍历法。  

如果需要在遍历的同时, 修改数组中的元素, 需要使用下标遍历法。  

如果仅仅是想要获取数组中的每一个元素, 不需要下标, 也不需要修改数组中的元素,  

使用增强for循环。 因为这种方式, 遍历的效率比下标遍历法高。



[](https://gitee.com/vip204888/java-p7)函数和数组的联合应用

---------------------------------------------------------------------



### [](https://gitee.com/vip204888/java-p7)函数传参分类



值传递:将保存简单数据的变量作为参数传递  

址传递:将保存地址的变量作为参数传递  

**址传递优点:让我们可以实现使用一个变量一次传递多个值**



### [](https://gitee.com/vip204888/java-p7)值传递和址传递比较



通过值作为参数传递,函数内部值的变量不会改变外部的值.  

通过地址作为参数传递,函数内部值的变量可以直接改变外部值



### [](https://gitee.com/vip204888/java-p7)案例



public class Demo4 {

public static void main(String[] args) {

//交换两个数的值

    int[] temp = {3,5};

//地址传递

    jiaohuan1(temp);

//我们发现通过址传递数组temp内的两个值发生了交换

    System.out.println("temp[0]:"+temp[0]+" temp[1]:"+temp[1]);// 53

//值传递

    int[] temp1 = {3,5};

    jiaohuan2(temp1[0],temp1[1]);

//通过值传递数组temp内的两个值没有发生交换

    System.out.println("temp1[0]:"+temp1[0]+"temp1[1]:"+temp1[1]);// 3 5

}

//地址传递

public static void jiaohuan1(int[] arr) {

    arr[0] = arr[0] ^ arr[1];

    arr[1] = arr[0] ^ arr[1];

    arr[0] = arr[0] ^ arr[1];

}

//值传递

public static void jiaohuan2(int a,int b) {

    a = a ^ b;

    b = a ^ b;

    a = a ^ b;

}

}




![在这里插入图片描述](https://img-blog.csdnimg.cn/fc5309a4e1014df7b471ae5cc9d9581d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbmdvZXI=,size_16,color_FFFFFF,t_70#pic_center)



内存说明:  

1.我们发现在值传递发生过程中,a和b的值在方法jiaohuan2中确实发生了交换,但是并没有影  

响到数组的值.  

2.在址传递过程中,方法jiaohuan1中的变量arr和main方法中的变量temp保存的是同一个数组  

的地址,所以此时不管我们通过那个变量进行操作,都会对数组的值进行改变.



**总结:址传递的最终原因是两个变量保存了同一个数组的地址,操作的是同一个数组.**



### [](https://gitee.com/vip204888/java-p7)案例



将上面例子中的址传递方法jiaohuan1替换成下面的方法jiaohuan3,再来观察数组temp的值,发现两个值并没有发生交换



public static void jiaohuan3(int[] arr) {//arr = temp

int[] arr2 = new int[2];

arr = arr2;

arr[0] = arr[0] ^ arr[1];

arr[1] = arr[0] ^ arr[1];

arr[0] = arr[0] ^ arr[1];

}




\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZVExSzD-1627046982037)(数组.assets/image-20210719194911059.png)\]



原因总结:当arr = arr2执行后,arr内部保存的地址变成了3456,此时我们再通过arr进行操作的是一个新数组,与temp指向的原数组没有任何关系.所以虽然此时是址传递,但是方法内部也没有影响外部值的变化.



[](https://gitee.com/vip204888/java-p7)排序

-------------------------------------------------------------



排序,即排列顺序,将数组中的元素按照一定的大小关系进行重新排列。  

根据时间复杂度和空间复杂度选择排序方法  

各算法的时间复杂度  

平均时间复杂度  

插入排序 O(n2)  

冒泡排序 O(n2)  

选择排序 O(n2)  

快速排序 O(n log n)  

堆排序 O(n log n)  

归并排序 O(n log n)  

基数排序 O(n)  

希尔排序 O(n1.25)  

复杂度作用:了解了时间复杂度和空间复杂度,可以更好的选择算法,提高排序查找的效率.



在Java中, 我们最常用的排序有:  

选择排序:固定值与其他值依次比较大小,互换位置。  

冒泡排序:相邻的两个数值比较大小,互换位置。  

JDK提供默认的升序排序



[](https://gitee.com/vip204888/java-p7)查询

-------------------------------------------------------------



### [](https://gitee.com/vip204888/java-p7)顺序查询



顺序查询, 即遍历数组中的每一个元素, 和要查询的元素进行对比。 如果是要查询的元素,  

这个下标就是要查询的下标。  

查询三要素:  

1.我们只找查到的第一个与key相同的元素,查询结束.  

2.当查询到与key相同的元素时,返回元素的下标  

3.如果没有查询到与key相同的元素,返回-1



### [](https://gitee.com/vip204888/java-p7)二分查询



二分查询, 即利用数组中间的位置, 将数组分为前后两个字表。 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。  

**二分查询, 要求数组必须是排序的, 否则无法使用二分查询。**  

![在这里插入图片描述](https://img-blog.csdnimg.cn/521a15ec12b949698880c58e6fb86e90.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbmdvZXI=,size_16,color_FFFFFF,t_70#pic_center)



[](https://gitee.com/vip204888/java-p7)可变长参数

----------------------------------------------------------------



可以接收多个类型相同的实参,个数不限,使用方式与数组相同。  

在调用方法的时候, 实参的数量可以写任意多个。  

作用:简化代码,简化操作等



\*\*语法:\*\*数据类型… 形参名



// 这里的参数paramters其实就是一个数组

static void show(int… parameters) {

//

}




[](https://gitee.com/vip204888/java-p7)二维数组

---------------------------------------------------------------



数组是一个拥有固定存储空间的连续的相同数据类型的仓库,,二维数组中,存储的是每个一维数组的地址,每一个维数组的空间不是连续的。



//应用数据类型填充的默认值是null。



二维数组, 其实就是数组中嵌套数组。


# **写在最后**

以上就是我的面试过程,为了这次面试,也收集了很多的面试题,反正我已经面过了,那就免费分享出来吧!

需要的朋友:**关注一下,然后[点击这里即可](https://gitee.com/vip204888/java-p7)免费领取**

以下是部分面试题截图

------------------------------------------



数组是一个拥有固定存储空间的连续的相同数据类型的仓库,,二维数组中,存储的是每个一维数组的地址,每一个维数组的空间不是连续的。



//应用数据类型填充的默认值是null。



二维数组, 其实就是数组中嵌套数组。


# **写在最后**

以上就是我的面试过程,为了这次面试,也收集了很多的面试题,反正我已经面过了,那就免费分享出来吧!

需要的朋友:**关注一下,然后[点击这里即可](https://gitee.com/vip204888/java-p7)免费领取**

以下是部分面试题截图

![Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此](https://img-blog.csdnimg.cn/img_convert/3f90ed90c526671889485f5c128cf89e.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值