Java数组
文章目录
- 前言
- 一维数组
- 数组定义
- 创建数组
- 数组的内存模型
- 数组数据初始化
- 数组元素访问
- 遍历数组length
- 常见数组异常
- 二分查找
- 数组的操作
- 数组的复制
- 数组的排序
- 二维数组
- 扩展
Java中定义数组的语法如下:
数据类型[] 数组名 = new 数据类型[数组长度];
数据类型指的是数组中元素的数据类型
数组名是自定义的数组标识符
数组长度指的是数组中元素的个数
例如,定义一个int类型的数组,长度为5:
int[] numbers = new int[5];
如果要给数组赋初值,可以在定义数组时使用花括号括起来的初值列表,例如:
int[] numbers = {1, 2, 3, 4, 5};
这样就定义了一个包含5个元素的整数数组,初始值分别为1、2、3、4、5。
前言
提示:这里可以添加本文要记录的大概内容:
在Java语言中,数组是引用类型中的一个,它在概念上属于类的范畴,但处理的方式又与类和对象不完全相同。
比如程序里面要想处理十位员工的数据,那么程序里要存十个变量,如果是一万名员工呢?我们只需要把一些相似的数据(员工姓名、工资)放到一个组里就好。用这个组代表多个相同的数据,对外只需要一个名字即可,方便管理多个数据。
提示:以下是本篇文章正文内容,下面案例可供参考
一维数组
数组是相同类型的数据按照顺序组合后的一种引用类型。
数组可以看成是多个相同类型数据的组合,实现对这些数据的统一管理。
数组的长度一旦确定后就不能更改,因此它是一个固定长度的结构。数组结构中每个存储的数据叫数组元素,数组元素由索引来定位。
索引(或叫数组下标)是指当前元素相对于第一个元素的位移,因此第一个元素的下标就是0,第二个元素的下标就是1,以此类推。
数组定义
数组声明的语法:
数据类型 [] 数组名;
[]放中间或后面都行
例如:
int [] a;
double [] b;
String str [];
定义时[]中不能指定长度
数组声明后,Java虚拟机就会给数组分配存储空间,情况如下图所示:
图4.1数组声明后的内存情况示意图
数组在声明后,但是没有创建前,并没有给它分配具体的内存空间,所以这个时候访问数组会出现NullPointerException异常。我们需要在访问数组前创建数组,确定数组的长度,以便能为数组分配内存空间。
创建数组
数组的长度在创建时指定,并且一旦指定就不能更改。创建数组有两种方式:
1、静态初始化
这种方式在声明的同时就直接初始化数组,同时也创建了数组空间。如:
int[] n = {1,2,3,4,5};
上面的语句运行后,就会创建一个数组n,这个数组的长度是5,他有5个元素,分别是1,2,3,4,5
2、动态初始化
这种创建方式的语法是:
数组名 = new 数组类型[数组长度];
int [] a = new int [3];
虚拟机运行java主方法时,会为主方法分配一块内存空间——栈区
栈区存放的是主方法运行时的定义的变量
java程序运行时,运行到new关键字时,虚拟机会在堆区中开辟新空间
引用数据类型的本质 存储的是堆区中某一块空间的地址
数字类型,默认值为0
字符型,默认值为‘\u0000’
布尔类型,默认值为false
对象类型,默认值为null
数组的内存模型
数组是存储多个相同类型数据的对象。数组的所有元素保存在堆内存中。
创建一个数组就是在堆中创建一个数组对象。数组创建后立即拥有默认值。索引从0开始。
int i = 10;
int [] a = new int [3];
System.out.println(a[2]);
数组空间在堆区中是连续分配的
数组空间中是有默认值
数组数据初始化
//数据的初始化
int a [] = {1,2,3}
int a [] = new int [] {1,2,3}
【例】创建数组并初始化
public class 数组数据初始化 {public static void main(String[] args) {int [] x = {30,22,28};System.out.println(x[1]);char [] n = new char [] {'a','b','c'};System.out.println(n[2]);}
}
数组元素访问
数组元素的访问需要根据数组名和下标共同实现
【例】
public class 数组数据访问 {public static void main(String[] args) {double [] x = {1.73,1.83,1.70,1.69};System.out.println(x[2]);x[3]=1.8; //数组名[元素下标] = 元素值;System.out.println(x[3]);}
}
数组数据访问 数组名[下标]
下标是从0开始第一位,连续分配
下标范围 0到长度-1
遍历数组length
数组是引用类型,具有属性,常用的数组属性就是数组的长度length,他必须>=0,利用他遍历数组
public class 使用长度属性遍历数据 {public static void main(String[] args) {String [] names = {"张三","李四","王五","赵六"} ;System.out.println(names.length);for (int i = 0; i < names.length; i++) {System.out.println(names[i]); }}
}
数组遍历:从第一个数据开始,依次使用访问到最后一个
数组使用时必须遍历才有最终意义
使用for循环结合长度属性遍历数组
常见数组异常
常见的数组异常包括:
1、数组下标越界异常(ArrayIndexOutOfBoundsException):当访问数组时使用了超出数组长度的下标,会引发数组下标越界异常。
2、空指针异常(NullPointerException):当尝试引用一个空对象的数组时,会抛出空指针异常
如:数组未初始化、没有创建而直接使用数组、数组为空等。
3、数组类型不匹配异常:当尝试将一个数据类型不匹配的值添加到数组中时,会引发数组类型不匹配异常。
4、非法参数异常:当传递给方法的参数不符合预期时,会引发非法参数异常,如传递负数长度。
5、数组存储异常:当试图将一个无效值存储到数组中时,会引发数组存储异常。
public class 数组使用异常 {public static void main(String[] args) {int [] a = {1,2,3};System.out.println(a[0]);//System.out.println(a[3]);//使用数组时,下标超出范围会引发数组越界异常double [] num = null;//空地址System.out.println(num[0]);//数组未被创建时去使用会引发空指针异常 }
}
二分查找
二分查找算法是一种常用的查找算法,它的核心思想是将一个有序的数组从中间分开,然后判断要查找的元素在哪一半,根据判断结果继续从一半中查找,以此类推,直到找到要查找的元素或者确定要查找的元素不在数组中。
以下是Java实现二分查找算法的代码:
public static int binarySearch(int[] arr, int target) {int start = 0, end = arr.length - 1;while (start <= end) {int mid = (start + end) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] > target) {end = mid - 1;} else {start = mid + 1;}}return -1;
}
在这个代码中,我们将要查找的区间的起始点和末尾点定义为start和end,然后计算中间值mid。
如果中间值等于目标值,则返回mid。如果中间值大于目标值,则在start到mid-1的区间内继续查找。
如果中间值小于目标值,则在mid+1到end的区间内继续查找。如果找不到目标值,则返回-1。
示例:
int[] arr = {1, 3, 5, 7, 9, 11}; // 定义一个有序数组
int target = 5; // 要查找的目标值
int position = binarySearch(arr, target); // 查找目标值的位置
if (position != -1) {System.out.println("目标值" + target + "在数组中的位置为" + position);
} else {System.out.println("目标值" + target + "不在数组中");
}
输出结果为:
目标值5在数组中的位置为2
数组的操作
数组的复制
Java中的数组的复制使用System.arraycopy
方法就可以实现
复制source数组中从下标srcPos开始的length个元素到目标数组dest,并从目标数组的下标为destPos的位置开始储存
其中各个参数的含义如下:
source
: 源数组中的起始位置
srcPos
:起始的下标
dest
: 目标数组
destPos
:目标数组中复制的起始位置
length
: 要复制的数组元素的个数
【例】
public class 数组的复制 {public static void main(String[] args) {int [] abc = {1,2,3,4,5};int [] mn = new int [10];//System.arraycopy(source,srcPos,dest,destPos,length)System.arraycopy(abc, 0, mn, 3, 4);//abc, 0, mn, 3, 4分别代表的意思//我从谁复制?从源头的哪个下表开始?复制给谁?赋值给mn的第几个数据开始?复制几个数据?for (int i = 0; i < mn.length; i++) {System.out.print(mn[i]+"\t");} }
}
【例】
int[] sourceArray = {1, 2, 3, 4};
int[] targetArray = new int[4];
System.arraycopy(sourceArray, 0, targetArray, 0, 4);
以上示例会将sourceArray数组中的元素复制到targetArray数组中。
因为源数组和目标数组的长度都是4,所以length参数传递的是4。
其中,srcPos和destPos都传递的是0,表示从数组的起始位置开始复制。
运行结果如下图4.20所示。
图4.20 Array_copy的运行结果
Arrays.sort(数组名)为数组排序的操作,但这个方法在 java.util 这个包里面,所以在用到的时候需要先将它导入。
Arrays.sort方法有两种常用方式,具体参数如下:
Arrays.sort(arr_name)
Arrays.sort(arr_name,fromIndex,toIndex)
其中:
arr_name:数组名称
fromIndex:排序的起始下标
toIndex:排序的终止下标
数组的排序
Java中可以使用Arrays类提供的sort()方法对数组进行排序。
下面是一个示例代码:
public class ArraySortExample {public static void main(String[] args) {int[] arr = {3, 7, 1, 9, 2, 5, 4, 6, 8};Arrays.sort(arr);System.out.println(Arrays.toString(arr));}
}
输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
在这个示例代码中,首先定义了一个int类型的数组arr,然后使用sort()方法对数组进行升序排序。
最后使用Arrays.toString()方法将排序后的数组转化为字符串输出。
如果需要对数组进行降序排序,则可以使用Collections类提供的reverseOrder()方法来获取一个降序排序的Comparator对象,然后将其作为参数传递给sort()方法。
示例代码如下:
public class ArraySortExample {public static void main(String[] args) {Integer[] arr = {3, 7, 1, 9, 2, 5, 4, 6, 8};Arrays.sort(arr, Collections.reverseOrder());System.out.println(Arrays.toString(arr));}
}
输出结果为:[9, 8, 7, 6, 5, 4, 3, 2, 1]
在这个示例代码中,首先定义了一个Integer类型的数组arr,然后使用Collections.reverseOrder()方法获取一个降序排序的Comparator对象,最后将其作为参数传递给sort()方法。
需要注意的是,由于Java中的基本数据类型不能直接使用泛型,因此在进行降序排序时需要将int类型的数组转化为Integer类型的数组。
二维数组
Java中的二维数组是指每个元素都是一个一维数组的数组,也就是说它是由多个一维数组组成。
二维数组可以看做一个表格,其中每行都是一个一维数组,每行中的每列都是一个元素。
在Java中,可以通过以下方式声明和初始化一个二维数组:
int[][] arr = new int[3][4];
这个语句声明了一个3行4列的二维数组,并将其所有元素初始化为0。
也可以通过以下方式初始化一个二维数组:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
这个语句声明了一个3行3列的二维数组,并将其初始化为指定的值。
访问二维数组中的元素需要使用两个索引,一个用于指定行,另一个用于指定列。例如,要访问二维数组中的第2行第3列的元素,可以使用以下语句:
int x = arr[1][2];
这个语句将数组中第2行第3列的元素赋值给变量x。
使用循环可以遍历二维数组中的所有元素。
例如,以下代码使用两个嵌套的for循环遍历一个3行4列的二维数组:
for(int i=0;i<3;i++){for(int j=0;j<4;j++){System.out.print(arr[i][j] + " ");}System.out.println();
}
这个代码将输出该二维数组中的所有元素。
扩展
找出数组中最大的数及下标
public class 找出数组中最大的数及下标 {public static void main(String[] args) {int[] arr = {10, 25, 33, 15, 27};//假定第一个数据为最大,0为最大下标int maxNum = arr[0];int maxIndex = 0;for(int i=1; i<arr.length; i++){if(arr[i] > maxNum){maxNum = arr[i];maxIndex = i;}}System.out.println("数组中最大的数为:" + maxNum + ",下标为:" + maxIndex);}
}
代码中,我们先设定数组的第一个元素为最大值,并将其下标设为0,然后通过for循环依次比较数组中的每个元素,如果当前元素比最大值大,则将最大值和最大值的下标更新为当前元素和当前元素的下标。最后输出最大值和其下标。
相关文章:

Java数组
文章目录 前言一维数组数组定义创建数组数组的内存模型数组数据初始化数组元素访问遍历数组length常见数组异常 二分查找数组的操作数组的复制数组的排序 二维数组扩展 Java中定义数组的语法如下: 数据类型[] 数组名 new 数据类型[数组长度]; 数据类型指的是数组中…...
【数据库原理入门】
数据库原理:深入探索与实践指南 引言 在我们的日常生活中,数据库无处不在,从在线购物、银行交易到社交媒体,都离不开数据库。要想成为一名出色的开发者,理解数据库原理是非常重要的。本文将以简明易懂的方式…...

练习Vue烘培坊项目
烘培坊项目 文章目录 烘培坊项目项目概述项目页面展示后台管理页面登录页面文章详情页面稿件发布页面 项目关键代码实现后台管理页面稿件管理页面内容列表页面文章详情页面烘培坊主页面注册页面登录页面个人信息页面稿件发布页面 项目概述 烘培坊(Bakery࿰…...

API测试| 了解API接口测试| API接口测试指南
什么是API? API是一个缩写,它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程,协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序:执行特定任务的程序。例程也称为过…...

使用canvas给图片添加水印
上接文章“图片处理” canvas元素其实就是一个画布,我们可以很方便地绘制一些文字、线条、图形等,它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候,使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…...

栈和队列的概念和实现
栈 栈 定义:只能在一端进行插入或删除操作的的线性表 主要特点:后进先出 存储结构的实现 顺序存储结构 链式存储结构 用途:通常作为一种临时存放数据的容器。如果后存入的元素先处理则使用栈。比如用于保存函…...

PostgreSQL 源码部署
文章目录 说明1. 准备工作1.1 源码包下载1.2 解压安装目录1.3 安装依赖包1.4 添加用户1.5 创建数据目录 2. 编译安装2.1 源码编译2.2 配置环境变量2.3 初始化数据库2.4 启动数据库2.5 连接数据库 3. 参数调整3.1 配置 pg_hba3.2 监听相关2.4 日志文件2.5 内存参数 说明 本篇文…...

医疗IT系统安科瑞隔离电源装置在医院的应用
【摘要】介绍该三级综合医院采用安科瑞隔离电源系统5件套,使用落地式配电柜安装方式,从而实现将TN系统转化为IT系统,以及系统绝缘情况监测。 【关键词】医用隔离电源系统;IT系统;绝缘情况监测;三级综合医院…...

高压放大器在3D打印中的应用
随着3D打印技术的快速发展,高压放大器在3D打印中的应用越来越受到人们的关注。高压放大器在3D打印中扮演着非常重要的角色,可以提高3D打印的效率和精度,从而实现更高的打印质量。本文将详细介绍高压放大器在3D打印中的应用及其原理。 高压放…...

chatgpt赋能python:Python中的三角函数介绍
Python中的三角函数介绍 Python作为一种高级编程语言,可以处理基础算术运算、三角函数等高等数学的操作。其中,三角函数是常用的数学函数之一,Pyhon中的三角函数包括正弦函数、余弦函数、正切函数等。 正弦函数 正弦函数在三角学中是最基本…...

异常检测论文1
本文仅作为个人阅读文献,做笔记记录。 <> \usepackage[dvipsnames]{xcolor} 一、摘要部分: 我们发现,现有的数据集偏向于局部结构异常,如划痕、凹痕或污染。特别是,它们缺乏违反逻辑约束形式的异常࿰…...
linux搭建hadoop环境
1、安装JDK (1)下载安装JDK:确保计算机联网之后命令行输入下面命令安装JDK sudo apt-get install sun-java8-jdk (2)配置计算机Java环境:打开/etc/profile,在文件最后输入下面…...

02 Maven创建及使用
maven作用 主要用作基于java平台的项目 maven能提供一种项目配置 maven能自动从maven的中央仓库帮我们自动下载并管路项目依赖的jar包 提供了标准的目录结构 中央仓库两种类型:共有的中央仓库:私有中央仓库 使用mvn -v查看是否安装成功 修改本地仓库的的位置 在setting…...

如何在 Rocky Linux 上检查磁盘空间?
在 Rocky Linux 上检查磁盘空间是系统管理和维护的重要任务之一。磁盘空间的监控和管理可以帮助我们及时发现和解决存储空间不足的问题,以确保系统的正常运行。本文将详细介绍在 Rocky Linux 上检查磁盘空间的方法。 方法 1:使用 df 命令 df 命令是 Li…...

【软考系统规划与管理师笔记】第2篇 信息技术知识1
目录 1 软件工程 1.1 软件需求分析与定义 1.2 软件设计、测试与维护 1.3 软件质量保证及质量评价 1.4 软件配置管理 1.5 软件过程管理 1.6 软件复用 2 面向对象系统分析与设计 2.1 面向对象设计的基本概念 2.2统一建模语言与可视化建模 3. 应用集成技术 3.1 数据库与…...

【无标题】ELISA-3(加装跟踪装置)—让群体协作更智能!
群体智能是近年来发展迅速的一个人工智能学科领域,通过对蚂蚁、蜜蜂等为代表的社会性昆虫群体行为的研究,实现分布式等智能行为。作为新一代人工智能的重要方向,群体智能通常用于无人机、机器人集群的协同作业。目前,群体智能在基…...

Dubbo源码解析一服务暴露与发现
Dubbo 服务暴露与发现 1. Spring中自定义Schema1.1 案例使用1.2 dubbo中的相关对象 2. 服务暴露机制2.1 术语解释2.2 流程机制2.3 源码分析2.3.1 导出入口2.3.2 导出服务到本地2.3.3 导出服务到远程(重点)2.3.4 开启Netty服务2.3.5 服务注册2.3.6 总结 3. 服务发现3.1 服务发现…...

有哪些工具软件一旦用了就离不开?
💖前言 目前,随着科技的快速发展,电脑已经进入了许许多多人的生活 ,在平日的学习、工作和生活里,我们会用的各种各样的强大软件。市面上除了某些大公司开发在强大软件,还有各路大神开发具有某些功能的强大…...

ObjectARX如何判断点和多段线的关系
目录 1 基本思路2 相关知识点2.1 ECS坐标系概述2.2 其他点坐标转换接口2.3 如何获取多段线的顶点ECS坐标 3 实现例程3.1 接口实现3.2 测试代码 4 实现效果 在CAD的二次开发中,点和多段线的关系是一个非常重要且常见的问题,本文实现例程以张帆所著《Objec…...
四、DRF序列化器create方法与update方法
上一章: 二、Django REST Framework (DRF)序列化&反序列化&数据校验_做测试的喵酱的博客-CSDN博客 下一章: 五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客 一、背景 1、创建请求,post,用户输入…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...