零基础 “入坑” Java--- 七、数组(二)

文章目录

  • 一、数组转字符串
  • 二、数组的拷贝
  • 三、求数组中元素的平均值
  • 四、查找数组中指定元素(顺序查找)
  • 五、数组排序(冒泡排序)
  • 六、查找数组中指定元素(二分查找)
  • 七、判断两个数组中的元素是否相等
  • 八、填充数据
  • 九、数组逆序
  • 十、二维数组

在上一章节中,我们已经对数组的知识进行了初步的学习;在本章节中,我们将通过对数组的练习进一步学习有关数组更多的知识。

一、数组转字符串

我们可以使用for循环来遍历数组:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}}

Java给我们提供了一个更快速的解决办法,借助工具类就可以完成:

import java.util.Arrays;public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5]}

当我们输入"Arrays"时,编译器会自动帮我们在首行导入"import java.util.Arrays;"语句,即导入所需的包。我们可以使用"Arrays.toString()"将数组内容转换为字符串进行输出(输出结果为字符串)。

接下来,我们尝试自己编写一个toString方法,使输出的结果 与Java提供的方法 输出的结果相同:

    public static String myToString(int[] array) {String ret = "[";for (int i = 0; i < array.length; i++) {ret += array[i];//最后一位数字结尾不需要逗号if(i != array.length - 1) {ret += ", ";}}ret += "]";return ret;}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};System.out.println(myToString(array)); //[1, 2, 3, 4, 5]}

二、数组的拷贝

当我们想将一个数组中的内容,拷贝到另一个数组中时,可以使用for循环对数组中的元素逐个操作:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] copy = new int[array.length]; //空数组System.out.println(Arrays.toString(copy)); //[0, 0, 0, 0, 0]for (int i = 0; i < array.length; i++) {copy[i] = array[i];}System.out.println(Arrays.toString(copy)); //[1, 2, 3, 4, 5]}

对于拷贝的结果,应该存在两组一样的值,我们再来分析一段代码,判断它是不是拷贝:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] array2 = array;System.out.println(Arrays.toString(array2)); //[1, 2, 3, 4, 5]}

虽然打印结果与 array 相同,但这并不是拷贝,只不过是让 array2 也指向了 array 的地址,访问的是同一个对象,在内存上是同一块空间。

对于数组的拷贝,Java也贴心的提供了更便捷的解决办法:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] copy = Arrays.copyOf(array, array.length);System.out.println(Arrays.toString(copy)); //[1, 2, 3, 4, 5]}

copyOf有两个参数,第一个参数是 想拷贝哪个数组,第二个参数是拷贝的长度。

基于上面的代码,我们对其进行扩容操作:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] copy = Arrays.copyOf(array, array.length * 2);System.out.println(Arrays.toString(copy)); //[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]}

我们对 copyOf 的第二个参数进行修改,即可完成扩容的操作。


当我们想获取数组中的部分元素时,Java也给我们提供了一种解决办法:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5,0,0,0,0,0};System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]int[] copy = Arrays.copyOfRange(array, 1, 5);System.out.println(Arrays.toString(copy)); //[2, 3, 4, 5]}

copyOfRange 有三个参数,第一个参数为想拷贝哪个数组,第二个参数为拷贝的起始位置,第三个参数为拷贝的结束位置。对于拷贝的范围,采取的是左闭右开区间,即可以获取到起始位置的值,但获取不到结束位置的值。

copyOfRange 的第三个参数超过了数组的最后一个元素也没关系,会根据当前数组的默认值数据类型自动填充:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5,0,0,0,0,0};System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]int[] copy = Arrays.copyOfRange(array, 0, 15);System.out.println(Arrays.toString(copy)); //[1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}

拷贝数组还有一种方式:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] copy = new int[array.length];System.arraycopy(array, 1, copy, 2, 2);System.out.println(Arrays.toString(copy)); //[0, 0, 2, 3, 0]}

System.arraycopy 有五个参数,第一个参数是想拷贝哪个数组(假设数组名为array),第二个参数为从 array 哪个位置开始拷贝,第三个参数为目的数组,第四个参数为目的数组的哪个位置,第五个参数为拷贝的长度。

在使用时,需确保拷贝的长度范围可以在 array 中获取到,否则程序会抛出异常:

    public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};int[] copy = new int[array.length];//错误示范:从 array 的1位置开始,获取不到 array.length(5)个元素!!!System.arraycopy(array, 1, copy, 2, array.length);System.out.println(Arrays.toString(copy));}

运行结果为:
在这里插入图片描述

三、求数组中元素的平均值

    public static double average(int[] array) {int sum = 0;for (int x:array) {sum += x;}return (double) sum / (double) array.length;}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};System.out.println(average(array)); //3.0}

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

要求:有一个已知数组,给出一个元素,查找该元素在数组中的位置:

    public static int find(int[] array, int x) {for (int i = 0; i < array.length; i++) {if (array[i] == x) {return i;}}return -1; //没找到}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};System.out.println(find(array, 3)); //2}

五、数组排序(冒泡排序)

要求:已知一个数组,让数组变得有序(升序或降序):

我们以升序为例:思路为:将数组中相邻元素从前到后进行两两比较,如果前一个元素比后一个元素大,则交换,一趟完成后,最大的元素就在数组的末尾;重复该过程,直至数组完全有序。
举个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    public static void bubbleSort(int[] array) {for (int i = 0; i < array.length - 1; i++) {boolean flg = true;//优化1:一趟走完,最后一个元素一定有序。(- i)for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {int tmp = array[j + 1];array[j + 1] = array[j];array[j] = tmp;flg = false;}}//优化2:某趟走完已经有序了if(flg == true) {break;}}}public static void main(String[] args) {int[] array = new int[]{8,6,9,5,4};bubbleSort(array);System.out.println(Arrays.toString(array));}

Java为我们提供了便捷的解决办法:

    public static void main(String[] args) {int[] array = new int[]{1,8,2,3,6,4,7,5};Arrays.sort(array);System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5, 6, 7, 8]}

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

针对有序数组,可以使用更高效的二分查找来解决这个问题。

我们先来学习二分查找的思想:

我们以升序数组为例,二分查找即先获取中间位置的元素n,再使用待查找元素与n进行比较
1.如果相等,即找到了,返回该元素在数组中的下标;
2.如果小于,则丢弃n右侧元素,以二分查找思想在n左侧重复操作。
3.如果大于,则丢弃n左侧元素,以二分查找思想在n右侧重复操作。

我们以图画形式举例:
在这里插入图片描述
由此,我们根据图中思想编写代码:

    public static int binarySearch(int[] array, int x) {int left = 0;int right = array.length - 1;while (left <= right) {int mid = (left + right) / 2;if (x < array[mid]) {//左侧寻找right = mid - 1;} else if (x > array[mid]) {//右侧寻找left = mid + 1;}else {//找到了return mid;}}return -1; //没找到}public static void main(String[] args) {int[] array = new int[]{9,1,8,2,10,3,6,4,7,5};Arrays.sort(array); //变有序System.out.println(Arrays.toString(array));System.out.println(binarySearch(array, 9)); //8}

当然,Java也给我们提供了二分查找的解决办法:

    public static void main(String[] args) {int[] array = new int[]{9,1,8,2,10,3,6,4,7,5};Arrays.sort(array);System.out.println(Arrays.binarySearch(array, 9)); //8}

七、判断两个数组中的元素是否相等

    public static void main(String[] args) {int[] array1 = new int[]{1,2,3,4,5,6};int[] array2 = new int[]{1,2,3,4,5,6};boolean ret = Arrays.equals(array1,array2);System.out.println(ret); //true}

八、填充数据

    public static void main(String[] args) {//数组中元素均为0int[] array = new int[10];//将数组中元素均填充为6Arrays.fill(array, 6);System.out.println(Arrays.toString(array));}

当然,我们也可以指定填充的范围:

    public static void main(String[] args) {//数组中元素均为0int[] array = new int[10];//将数组中元素下标为0~4填充为6Arrays.fill(array, 0, 5, 6);System.out.println(Arrays.toString(array));}

在这里需要注意,对于填充的范围为左闭右开区间。

九、数组逆序

要求:给定一个数组,将里面的元素逆序排列。

解题思路为:设定两个下标,分别指向第一个元素和最后一个元素,将两个值交换;让指向第一个元素的下标自增,指向最后一个元素的下标自减,循环即可。

    public static void nix(int[] array) {int left = 0;int right = array.length - 1;while (left < right) {int tmp = array[left];array[left] = array[right];array[right] = tmp;left++;right--;}}public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};nix(array);System.out.println(Arrays.toString(array));}

十、二维数组

二维数组的每一个元素都是一个一维数组。

语法格式:

数据类型[][] 数组名称 = new 数据类型[行数][列数]{初始化数据};

体现到代码上有三种写法:

int[][] array1 = new int[][]{{1,2,3},{4,5,6}};
int[][] array2 = {{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3]; //数组中元素为0

在这里插入图片描述
当我们想要逐个访问数组中的元素时,可以使用双层for循环来完成:

    public static void main(String[] args) {int[][] array1 = new int[][]{{1,2,3},{4,5,6}};for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {System.out.print(array1[i][j] + " ");}System.out.println();}}

二维数组是一个特殊的一维数组
在这里插入图片描述
二维数组元素中存放的为一维数组的地址,当访问二维数组中的元素时,会根据元素中存放的地址找到一维数组。

当数据较多时,我们依旧可以使用length来获取数组长度;但需要注意在第二层循环时,数组的长度应为 二维数组元素中 存放的地址 指向的 当前一维数组的长度

    public static void main(String[] args) {int[][] array1 = new int[][]{{1,2,3},{4,5,6}};for (int i = 0; i < array1.length; i++) {for (int j = 0; j < array1[i].length; j++) {System.out.print(array1[i][j] + " ");}System.out.println();}}

对于二维数组,Java也提供了更便捷的方法可以达到同上的效果:

    public static void main(String[] args) {int[][] array1 = new int[][]{{1,2,3},{4,5,6}};System.out.println(Arrays.deepToString(array1));//[[1, 2, 3], [4, 5, 6]]}

在Java中的二维数组可以是不规则的:

//可以省略列数不写
int[][] array1 = new int[2][];
array1[0] = new int[]{1,2,3};
array1[1] = new int[]{4,5,6,7,8,9};

当省略列数,且没有赋值的时候,二维数组中的元素存储的默认值为null,在操作时要注意可能会出现空指针异常的情况,如:

    public static void main(String[] args) {int[][] array1 = new int[2][];System.out.println(array1[0].length);}

运行结果为:
在这里插入图片描述


Ending。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89857.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++ 真题】P1104 生日

P1104 生日 题目描述 cjf 君想调查学校 OI 组每个同学的生日&#xff0c;并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多&#xff0c;没有时间&#xff0c;所以请你帮她排序。 输入格式 输入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行为 OI 组总人数 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外键一致性的区别

针对于unique索引在主外键上的表现&#xff0c;o和PG的行为确实不一致&#xff0c;测试样例&#xff1a;PG:测试1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …

06.自动化测试概念

自动化测试概念 1. 自动化1.1 回归测试1.2 自动化分类 1.3 自动化测试金字塔2. web自动化测试3.Selenium 1. 自动化 ​ **自动化测试&#xff08;Automated Testing&#xff09;&#xff1a;**是指使用软件工具或脚本来自动执行测试任务&#xff0c;代替人工进行重复性、繁琐的…

页面登录数据的加密(前端+后端)

本加密过程使用的 AESRSA概要1.使用AES对传输数据进行加密AES为对称加密,加密和解决所需要的key是一样的,所以拦截到AES key就可以直接解密,所以需要结果RSA进行加密2.对AES的key进行RSA加密RSA为非对称加密,客户端只能获取到publicKey(公钥),而解密只能使用服务器的privateKey…

PC端基于SpringBoot架构控制无人机(一):初识无人机控制

一、无人机飞控系统的概述飞控&#xff08;Flight Controller&#xff09;是无人机最为核心的组成部分之一&#xff0c;负责实现无人机的自主飞行控制和稳定飞行。飞控系统的功能决定了无人机的飞行性能&#xff0c;包括飞行的稳定性、操控的响应速度、导航的精确度等。通过飞控…

QT6 源(154)模型视图架构里的列表视图 QListView:先学习属性部分,

&#xff08;1&#xff09;属性总图&#xff0c;以及测试程序的框架 &#xff1a; 开始属性的学习 &#xff1a; &#xff08;2&#xff09; 继续属性学习 &#xff1a; &#xff08;3&#xff09; 谢谢

MySQL——9、事务管理

事务管理 1、什么是事务&#xff1f;2、事务常见操作方式3、事务隔离级别4、数据库并发场景4.1、读-写4.2、RR与RC的本质区别 1、什么是事务&#xff1f; mysql是基于CS模式的&#xff0c;是一套网络服务&#xff0c;所以我们是可以在本地连接上远程服务器的mysql服务端的。my…

Python之面向对象详解(一篇足矣)

目录 一、初阶面向对象 1. 初识面向对象 1.1 对象和self 1.2 常见成员 1.3 应用示例 将数据封装到一个对象&#xff0c;便于以后使用。 将数据封装到对象中&#xff0c;在方法中对原始数据进行加工处理。 根据类创建多个对象&#xff0c;在方法中对对象中的数据进行修改…

【Qt】qml组件对象怎么传递给c++

将QML组件对象传递给C的方法 在QML和C之间传递完整的组件对象需要特殊处理&#xff0c;因为QML组件是动态创建的JavaScript对象。以下是几种有效的方法&#xff1a; 1. 使用QObject指针传递 C端设置 // MyClass.h #include <QObject> #include <QQuickItem>cla…

Java基础 集合框架 List框架

list架构 list接口list 核心特性以及扩展Collection的体现 抽象类 AbstractList抽象类 AbstractSequentialList (简化链表的顺序访问)AbstractSequentialList 核心特点自定义实现示例代码讲解其实现原理AbstractSequentialList 总结与AbstractList的对比 List 实现类 ArrayList…

2025年6月28和29日复习和预习(C++)

学习笔记大纲​一、预习部分&#xff1a;数组基础​&#xff08;一&#xff09;核心知识点​数组的创建&#xff1a;掌握一维数组的声明方式&#xff0c;如int arr[5];&#xff08;创建一个包含 5 个整数的数组&#xff09;。重点在于理解数组长度需为常量&#xff0c;且在声明…

【centos8服务如何给服务器开发3306端口】

在 CentOS 8 中开放 MySQL 默认端口 3306&#xff0c;需要配置防火墙和 SELinux。以下是详细步骤&#xff1a; 1. 开放防火墙端口&#xff08;Firewalld&#xff09; CentOS 8 默认使用 firewalld 管理防火墙&#xff0c;执行以下命令开放 3306 端口&#xff1a; # 开放 TCP 33…

python系列之:使用md5和sha256完成签名认证,调用接口

python系列之:使用md5和sha256完成签名认证,调用接口 MD5签名和sha256签名认证md5认证代码sha256认证代码拼接签名生成签名拼接url调用接口MD5签名和sha256签名认证 MD5签名认证 算法特性: 生成128位(16字节)的哈希值计算速度快已被证明存在碰撞漏洞(不同输入可能产生相同…

SpringBatch配置与入门实例

通过对SpringBatch基础概念的了解&#xff0c;参考&#xff1a;SpringBatch使用介绍 任何技术用起来之后&#xff0c;再去探究内部细节的原理&#xff0c;才会事半功倍。下面记录一下笔者在SpringBoot项目中集成SpringBatch&#xff0c;并且通过一个小的实例展示如何简单使用它…

spdlog 项目介绍与二次封装

目录 介绍 二次封装 介绍 spdlog 是C开源的第三方日志库&#xff0c;整个项目在 spdlog 命名空间中。 在 spdlog 命名空间的 level 命名空间里定义了枚举类型&#xff0c;把日志分为了 5 个等级&#xff1a;trace debug info warn err critical enum level_enum : in…

shell编程之awk命令详解

1. awk 教程 1.1 调用 awk awk 是一种强大的文本处理工具&#xff0c;在 Linux 系统中广泛应用于日志分析、数据处理等场景。调用 awk 主要有以下三种方式&#xff1a; 1.1.1 命令行方式 基本语法为&#xff1a; awk (-F filed-separator) commands input-files其中&#…

服务器需要备案吗?在哪些地区需要备案?

&#x1f3af; 服务器是否需要备案&#xff1f; 是否需要备案&#xff0c;关键看以下两个因素&#xff1a; 服务器所在地&#xff08;机房位置&#xff09; 网站面向的访问群体&#xff08;境内或境外&#xff09; &#x1f3f7; 中国大陆&#xff08;境内&#xff09;服务器…

HarmonyOS学习3---ArkUI

1、组件 1.1、基础组件 1.2、布局容器 1.3、页面导航 1.4、其他组件 2、ArkTs/C混合开发&#xff0c;高性能编码 3、布局能力&交互归一 4、实时开发预览

Java学习第十五部分——MyBatis

目录 一.概述 二.特点 三.组件 四.Mapper 五.配置文件 六.使用步骤 七.高级功能 八.优点缺点 九.项目实战 1.打开idea创建一个Java项目&#xff0c;构建系统选“Maven”​ 2.创建完成后若依赖报错&#xff0c;可通过下载或重新加载来解决​ 3.配置pom.xml文件&…

小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问

在数字化时代&#xff0c;很多普通公司小企业规模的&#xff0c;利用本地小型服务器或计算机搭建私有云服务器&#xff0c;不仅可以提升数据管理效率&#xff0c;还能保障业务数据的安全性和灵活性。以下是为小企业量身定制的私有云服务器搭建指南&#xff0c;及最后附无公网IP…