【Java探索之旅】掌握数组操作,轻松应对编程挑战,2024年最新java高级工程师面试题目

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:xhs1999xhs (备注Java)
img

正文

个人头像

🎥 屿小夏 :
个人主页

🔥个人专栏 :
Java编程秘籍

🌄 莫道桑榆晚,为霞尚满天!

文章目录

📑前言

掌握数组的基本操作对于编写高效的程序至关重要。本文将深入探讨数组的一些常见操作,包括数组转字符串、数组拷贝、求平均值、顺序查找、二分查找、数组排序等。通过学习这些操作,您将更加熟练地处理数组,提高代码的质量和效率。

一、数组巩固练习

1.1 数组转字符串

import java.util.Arrays

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

String newArr = Arrays.toString(arr);
System.out.println(newArr);

// 执行结果
[1, 2, 3, 4, 5, 6]

使用了 java.util.Arrays 类中的 toString 方法。这个方法接收一个数组作为参数,并返回一个表示该数组的字符串。这个字符串是由数组元素的字符串表示形式组成,并使用逗号和空格分隔,并且整个字符串被方括号 [] 包围

使用这个方法后续打印数组就更方便一些

1.2 数组拷贝

import java.util.Arrays;
public static void func(){
    // newArr和arr引用的是同一个数组
    // 因此newArr修改空间中内容之后,arr也可以看到修改的结果
    int[] arr = {1,2,3,4,5,6};
    int[] newArr = arr;
    newArr[0] = 10;
    System.out.println("newArr: " + Arrays.toString(arr));
    
    // 使用Arrays中copyOf方法完成数组的拷贝:
    // copyOf方法在进行数组拷贝时,创建了一个新的数组
    // arr和newArr引用的不是同一个数组
    arr[0] = 1;
    newArr = Arrays.copyOf(arr, arr.length);
    System.out.println("newArr: " + Arrays.toString(newArr));
    
    // 因为arr修改其引用数组中内容时,对newArr没有任何影响
    arr[0] = 10;
    System.out.println("arr: " + Arrays.toString(arr));
    System.out.println("newArr: " + Arrays.toString(newArr));
    
    // 拷贝某个范围.
    int[] newArr2 = Arrays.copyOfRange(arr, 2, 4);
    System.out.println("newArr2: " + Arrays.toString(newArr2));
}

在这里插入图片描述在这里插入图片描述

Arrays.copyOf 是 Java 中 java.util.Arrays 类的一个静态方法,用于创建并返回数组的一个副本,可以指定副本数组的长度。如果新数组的长度大于原数组的长度,那么多余的元素会以默认值填充;如果新数组的长度小于原数组的长度,则只复制前部分元素。

Arrays.copyOf 方法的基本语法如下:

arr1_copy = Arrays.copyOf(arr1, new_length);

  • arr1:是需要拷贝的原数组。
  • new_length:是拷贝后的新数组的长度。如果不指定此参数,将使用原数组的长度。

Arrays.copyOf 返回的是一个新的数组对象,所以改变返回数组中的元素值不会影响原来的数组。

注意:数组当中存储的是基本类型数据时,不论怎么拷贝基本都不会出现什么问题,但如果存储的是引用数据类
型,拷贝时需要考虑深浅拷贝的问题,后面文章会进行讲解。

实现自己版本的拷贝数组

public static int[] copyOf(int[] arr) {
    int[] ret = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
    	ret[i] = arr[i];
    } 
    return ret;
}

1.3 求数组中的平均值

给定一个整型数组, 求平均值

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,6};
    System.out.println(avg(arr));
}
public static double avg(int[] arr) {
    int sum = 0;
    for (int x : arr) {
    sum += x;
} 
    return (double)sum / (double)arr.length;
} 
// 执行结果
3.5

1.4 查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置

public static void main(String[] args) {
    int[] arr = {1,2,3,10,5,6};
    System.out.println(find(arr, 10));
}
public static int find(int[] arr, int data) {
    for (int i = 0; i < arr.length; i++) {
    	if (arr[i] == data) {
    	return i;
	}
// 表示没有找到
    return -1;
} 
// 执行结果
3

1.5 查找数组中指定元素(二分查找)

针对有序数组, 可以使用更高效的二分查找

有序分为 “升序” 和 “降序”
如 1 2 3 4 , 依次递增即为升序.
如 4 3 2 1 , 依次递减即为降序

以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较:

  • 如果相等,即找到了返回该元素在数组中的下标
  • 如果小于,以类似方式到数组左半侧查找
  • 如果大于,以类似方式到数组右半侧查找
public static void main(String[] args) {
	int[] arr = {1,2,3,4,5,6};
	System.out.println(binarySearch(arr, 6));
}

public static int binarySearch(int[] arr, int toFind) {
    int left = 0;
    int right = arr.length - 1;
    
    while (left <= right) {
        int mid = (left + right) / 2;
    	if (toFind < arr[mid]) {
    		// 去左侧区间找
    		right = mid - 1;
    	} else if (toFind > arr[mid]) {
    	// 去右侧区间找
    		left = mid + 1;
    	} else {
    	// 相等, 说明找到了
    		return mid;
    	}
    } 
    // 循环结束, 说明没找到
    return -1;
} 
// 执行结果
5

这个查找的效率还是很高效的,一次就可以砍掉一半的数据,并且在数据越大的时候越有优势。

1.6 数组排序(冒泡排序)

给定一个数组, 让数组升序 (降序) 排序.
算法思路

假设排升序:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
  2. 依次从上上述过程,直到数组中所有的元素都排列好

在这里插入图片描述

public static void main(String[] args) {
    int[] arr = {9, 5, 2, 7};
    bubbleSort(arr);
    System.out.println(Arrays.toString(arr));
}

public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = 1; j < arr.length-i; j++) {
            if (arr[j-1] > arr[j]) {
                int tmp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = tmp;
			}
        }
    } // end for
} // end bubbleSort
// 执行结果
[2, 5, 7, 9]

冒泡排序性能较低. Java 中内置了更高效的排序算法

public static void main(String[] args) {
	int[] arr = {9, 5, 2, 7};
	Arrays.sort(arr);
	System.out.println(Arrays.toString(arr));
}

关于 Arrays.sort 的具体实现算法,后期会有专门的篇章来讲解。

1.7 数组逆序

给定一个数组, 将里面的元素逆序排列.

思路

  • 设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.
  • 然后让前一个下标自增, 后一个下标自减, 循环继续即可
public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4};
    reverse(arr);
    System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {
    int left = 0;
    int right = arr.length - 1;
    
    while (left < right) {
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
	}
}

🌤️全篇总结

通过本篇的学习,您已经掌握了Java数组的一些重要操作技巧,包括数组转字符串、数组拷贝、求平均值、顺序查找、二分查找、数组排序和数组逆序等。这些操作对于日常编程和算法设计都具有重要意义,希望您能够灵活运用这些技巧,提升自己的编程能力。

在这里插入图片描述

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇
  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
详解15 某著名社交类上市公司软件工程师笔试题

  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中…(img-fLV7ea3J-1713614602800)]

资料整理不易,点个关注再走吧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)
[外链图片转存中…(img-541oRjvz-1713614602801)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值