Java之数组详解

一、数组的概念

数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号(索引)的方式对这些数据进行统一管理。数组是程序设计中的一种基本数据结构,用于存储相同类型的数据。在Java中,数组是一种对象,它存储在堆内存中,而数组名则引用这块连续空间的首地址。

二、数组的特点

1. 类型相同

数组中的元素必须是相同类型的数据。

2. 长度固定

数组一旦创建,其长度就固定了,不能动态地增加或减少。

3. 下标索引

数组元素通过下标访问,下标从0开始,最大值为数组长度减1。

4. 内存连续

数组在内存中是一段连续的空间,因此可以通过下标快速访问任意位置的元素。

三、数组的创建

在Java中,数组的创建可以通过两种方式进行:静态初始化和动态初始化。

1. 静态初始化

在创建数组时,直接指定数组中的元素。

int[] array1 = {1, 2, 3, 4}; // 创建一个包含4个int类型元素的数组
double[] array2 = {1.1, 2.2, 3.3}; // 创建一个包含3个double类型元素的数组
String[] array3 = {"Hello", "World", "Java"}; // 创建一个包含3个字符串元素的数组

2. 动态初始化

在创建数组时,只指定数组的长度,不直接指定数组中的元素。动态初始化后,数组中的元素会有默认值,对于数值类型,默认值为0;对于boolean类型,默认值为false;对于引用类型,默认值为null。

int[] array4 = new int[5]; // 创建一个包含5个int类型元素的数组,初始值都为0
boolean[] array5 = new boolean[3]; // 创建一个包含3个boolean类型元素的数组,初始值都为false
String[] array6 = new String[2]; // 创建一个包含2个字符串元素的数组,初始值都为null

四、数组的使用

1. 访问数组元素

通过下标可以访问数组中的元素。下标从0开始,最大值为数组长度减1。

int[] array = {1, 2, 3, 4, 5};
System.out.println(array[0]); // 输出:1
System.out.println(array[4]); // 输出:5

需要注意的是,如果访问的下标超出了数组的有效范围(即小于0或大于等于数组长度),则会抛出ArrayIndexOutOfBoundsException异常。

2. 修改数组元素

通过下标可以修改数组中的元素。

int[] array = {1, 2, 3, 4, 5};
array[0] = 10; // 将第一个元素修改为10
System.out.println(array[0]); // 输出:10

3. 获取数组长度

数组对象有一个length属性,用于获取数组中元素的个数。

int[] array = {1, 2, 3, 4, 5};
System.out.println(array.length); // 输出:5

4. 数组的遍历

遍历数组是指将数组中的所有元素都访问一遍,通常使用循环语句来实现。

int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length; i++) {System.out.println(array[i]);
}

另外,还可以使用增强for循环(也称为foreach循环)来遍历数组,这种方式更加简洁,但不能在循环体内修改数组的值。

int[] array = {1, 2, 3, 4, 5};
for (int num : array) {System.out.println(num);
}

5. 数组作为方法的参数

数组可以作为方法的参数进行传递。在方法内部,可以通过下标访问数组中的元素。

public class Test {public static void printArray(int[] arr) {for (int num : arr) {System.out.println(num);}}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};printArray(array);}
}

需要注意的是,在Java中,数组作为方法参数传递时,实际上是传递了数组的引用,而不是数组的副本。因此,在方法内部对数组进行修改,会影响到原数组。

五、数组的相关方法

Java提供了java.util.Arrays类,包含了一些用于操作数组的方法。

1. 排序

使用Arrays.sort()方法可以对数组进行排序。

int[] array = {5, 3, 8, 1, 2};
Arrays.sort(array);
System.out.println(Arrays.toString(array)); // 输出:[1, 2, 3, 5, 8]

2. 查找

使用Arrays.binarySearch()方法可以在有序数组中查找指定元素的下标。如果找到,则返回元素的下标;如果未找到,则返回负值,负值的绝对值减1表示插入点,即在该点插入元素后,数组仍然有序。

int[] array = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(array, 3);
System.out.println(index); // 输出:2

需要注意的是,Arrays.binarySearch()方法要求数组必须是有序的,否则会得到错误的结果。

3. 复制

使用Arrays.copyOf()方法可以复制数组。

int[] array = {1, 2, 3, 4, 5};
int[] copiedArray = Arrays.copyOf(array, array.length);
System.out.println(Arrays.toString(copiedArray)); // 输出:[1, 2, 3, 4, 5]

4. 填充

使用Arrays.fill()方法可以用指定的值填充数组。

int[] array = new int[5];
Arrays.fill(array, 666);
System.out.println(Arrays.toString(array)); // 输出:[666, 666, 666, 666, 666]

5. 转换为字符串

使用Arrays.toString()方法可以将数组转换为字符串表示形式。

int[] array = {1, 2, 3, 4, 5};
String str = Arrays.toString(array);
System.out.println(str); // 输出:[1, 2, 3, 4, 5]

六、多维数组

多维数组是数组的数组,即数组的元素本身也是一个数组。在Java中,多维数组可以是二维数组、三维数组等。

1. 二维数组

二维数组可以看作是一个表格,其中每个元素都是一个一维数组。

int[][] array = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问二维数组中的元素
System.out.println(array[0][1]); // 输出:2

二维数组的初始化也可以分为静态初始化和动态初始化。

// 静态初始化
int[][] array1 = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 动态初始化
int[][] array2 = new int[3][3];
for (int i = 0; i < array2.length; i++) {for (int j = 0; j < array2[i].length; j++) {array2[i][j] = i * 3 + j + 1;}
}

2. 三维数组及更高维数组

三维数组及更高维数组的概念与二维数组类似,只是数组的层次更多。在实际应用中,三维数组及更高维数组的使用相对较少。

七、数组的应用场景

数组在Java编程中有广泛的应用场景,例如:

1. 存储数据

用于存储一组相同类型的数据。

2. 算法实现

如排序算法、查找算法等。

3. 图形处理

如二维数组可以用于表示图像中的像素点。

4. 游戏开发

如二维数组可以用于表示游戏地图中的格子。

八、综合示例

下面是一个综合示例,展示了如何声明数组、初始化数组、访问数组元素、遍历数组以及使用Arrays类的方法。

public class ArrayExample {  public static void main(String[] args) {  // 声明并初始化一维数组  int[] oneDimensionalArray = {1, 2, 3, 4, 5};  // 访问一维数组元素  System.out.println("一维数组的第一个元素: " + oneDimensionalArray[0]);  // 修改一维数组元素  oneDimensionalArray[0] = 10;  System.out.println("修改后的一维数组的第一个元素: " + oneDimensionalArray[0]);  // 遍历一维数组  System.out.println("一维数组的所有元素为:");  for (int i = 0; i < oneDimensionalArray.length; i++) {  System.out.print(oneDimensionalArray[i] + " ");  }  // 声明并初始化二维数组  int[][] twoDimensionalArray = {  {1, 2, 3},  {4, 5, 6},  {7, 8, 9}  };  // 访问二维数组元素  System.out.println("二维数组的第一个元素: " + twoDimensionalArray[0][0]);  // 修改二维数组元素  twoDimensionalArray[0][0] = 10;  System.out.println("修改后的二维数组的第一个元素: " + twoDimensionalArray[0][0]);  // 遍历二维数组  System.out.println("二维数组的所有元素为:");  for (int i = 0; i < twoDimensionalArray.length; i++) {  for (int j = 0; j < twoDimensionalArray[i].length; j++) {  System.out.print(twoDimensionalArray[i][j] + " ");  }  System.out.println(); // 换行,以便更清晰地显示二维数组  }  // 使用Arrays类的方法对数组进行排序  int[] arrayToSort = {5, 3, 8, 1, 2};  Arrays.sort(arrayToSort);  System.out.println("排序后的数组: " + Arrays.toString(arrayToSort));  // 使用Arrays类的方法查找数组元素  int index = Arrays.binarySearch(arrayToSort, 3);  if (index >= 0) {  System.out.println("元素3在数组中的索引为: " + index);  } else {  System.out.println("元素3在数组中未找到,插入点为: " + (-index - 1));  }  // 使用Arrays类的方法复制数组  int[] copiedArray = Arrays.copyOf(arrayToSort, arrayToSort.length);  System.out.println("复制后的数组: " + Arrays.toString(copiedArray));  // 使用Arrays类的方法填充数组  int[] filledArray = new int[5];  Arrays.fill(filledArray, 666);  System.out.println("填充后的数组: " + Arrays.toString(filledArray));  // 使用Arrays类的方法将数组转换为字符串  String arrayAsString = Arrays.toString(arrayToSort);  System.out.println("数组转换为字符串: " + arrayAsString);  }  
}

解释:
一维数组:
声明并初始化了一个包含5个整数的一维数组。
访问并修改了一维数组的第一个元素。
使用for循环遍历了一维数组的所有元素,并打印出来。
二维数组:
声明并初始化了一个3x3的二维数组。
访问并修改了二维数组的第一个元素。
使用嵌套的for循环遍历了二维数组的所有元素,并打印出来。
Arrays类的方法:
使用Arrays.sort()方法对一维数组进行了排序,并打印了排序后的数组。
使用Arrays.binarySearch()方法在一维数组中查找了元素3的索引,并打印了结果。
使用Arrays.copyOf()方法复制了一维数组,并打印了复制后的数组。
使用Arrays.fill()方法填充了一个一维数组,并打印了填充后的数组。
使用Arrays.toString()方法将一维数组转换为了字符串表示形式,并打印了结果。
通过以上代码和解释,您可以更全面地了解Java数组的声明、初始化、访问、修改、遍历以及Arrays类的方法的使用。

九、总结

数组是程序设计中的基本数据结构,用于存储相同类型的数据。Java中的数组具有类型相同、长度固定、下标索引和内存连续等特点。在使用数组时,可以访问和修改数组元素,获取数组长度,遍历数组,并将数组作为方法参数传递。此外,Java提供了Arrays类,包含排序、查找、复制、填充和转换为字符串等方法,方便对数组进行操作。本文还介绍了多维数组的概念和应用场景,并给出了一个综合示例,展示了如何声明、初始化、访问、遍历数组以及使用Arrays类的方法。通过本文的学习,可以更全面地了解Java数组的相关知识。

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

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

相关文章

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖&#xff0c;安装apr软件&#xff0c;阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件&#xff0c;主要提供针对apr环境的管理工具&#xff0c; 3.安装阿帕奇软件即httpd软件。 如上图所示&#xff0c;就是三个软件的…

E38.【C语言】练习:数据结构时间复杂度的计算

目录 1.二分法的时间复杂度 解: 2.求阶乘的时间复杂度 解: 3.递归实现斐波那契数,求时间复杂度 解: 4.时间复杂度的排名 备注:有关时间复杂度的讲解参见80.【C语言】数据结构之时间复杂度 1.二分法的时间复杂度 (代码来自E7.【C语言】练习&#xff1a;在一个有序数组中…

RK3568笔记六十六:Live555推流

若该文为原创文章,转载请注明原文出处。 前面移植了live555,记录使用rk3568推流 一、流程 推流过程是在前面RTMP工程上修改的。RTMP推流是采集摄像头数据,AI推理,编码成H264通过FFMEPG推流,现在把FFMPEG改成使用Live555. 步骤: 1、使用opencv采集摄像头数据 2、初始化…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年&#xff0c;CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream&#xff0c;这是…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

第28周:Transformer 实现文本分类 - Embedding版

目录 前言 一、前期准备 1.1 环境安装 1.2 加载数据 二、数据预处理 2.1 构建词典 2.2 进行one-hot编码 2.3 自定义数据集类 2.4 定义填充函数 2.5 构建数据集 三、模型构建 3.1 定义位置编码器 3.2 定义Transformer模型 3.3 定义训练函数 3.4 定义测试函数 四、…

RabbitMQ高级特性详解

前言 RabbitMQ是一款广泛使用的开源消息队列软件&#xff0c;它基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现。本文将带你深入了解RabbitMQ的一些高级特性&#xff0c;包括消息确认、死信队列、延迟队列、事务处理以及消息分发策略等&#xff…

HCIE-Datacom题库_01_防火墙【18道题】

一、单选题 1.相比较于路由器、交接机&#xff0c;防火墙转发独有的模块为? 交换网板 MPU LPU SPU 解析&#xff1a; SFU&#xff08;Switch Fabric Unit&#xff09;&#xff1a;交换网板&#xff0c;负责整个系统的数据平面数据平面提供高速无阻塞数据通道&#xff0…

关于SOCKS协议的常见误区有哪些?

代理协议在设备与代理服务器之间的数据交换中起到了关键作用。在这方面&#xff0c;SOCKS代理协议是常见的选择之一&#xff0c;被广泛应用于下载、传输和上传网络数据的场景。然而&#xff0c;关于SOCKS代理协议存在一些常见的误解&#xff0c;让我们来逐一了解。 一、使用SO…

爬虫逆向-js进阶(续写,搭建网站)

1.搭建简单网站1 from flask import Flask,render_template import requests import json app Flask(name)# **location**的温度是**temp**度&#xff0c;天气状况&#xff1a;**desc**app.route(/) # 绑定处理函数 def index_url():location 101010100data get_weather(lo…

Whisper 音视频转写

Whisper 音视频转写 API 接口文档 api.py import os import shutil import socket import torch import whisper from moviepy.editor import VideoFileClip import opencc from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request from fastapi.respons…

Android中的内存泄漏及其检测方式

Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中&#xff0c;内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中&#xff0c;由于某些原因&#xff0c;已经不再使用的对象仍然被引用&#xff0c;导致垃圾回收器&#xff08;Garbage Col…

图书管理新纪元:Spring Boot进销存系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理图书进销存管理系统的相关信息成为必然。开…

使用 Elasticsearch Dump 工具进行生产环境到测试环境的数据迁移与备份

es-dump 是 Elasticsearch 的一个实用工具&#xff0c;专门用于从 Elasticsearch 集群中导出或导入数据&#xff0c;支持数据、映射、别名、模板等多种类型的数据操作。它在数据迁移、备份、恢复等场景中非常实用。本文将展示如何使用 es-dump 工具执行生产到测试环境的索引复制…

【学习】word保存图片

word中有想保存的照片 直接右键另存为的话&#xff0c;文件总是不清晰&#xff0c;截屏的话&#xff0c;好像也欠妥。 怎么办? 可以另存为 网页 .html 可以得到&#xff1a; 原图就放到了文件夹里面

Selenium 中定位元素操作集合

Selenium中元素的定位与操作 在 Selenium 中定位单个元素一般通过 find_element 方法来实现&#xff0c;一组数据则是 find_elements &#xff08;定位时应该元素加载完整再 再定位&#xff0c;否则可能会出现找不到对应元素的情况出现。这里可以使用 time.sleep() 来实现等待…

C++简易日志系统:打造高效、线程安全的日志记录工具

目录 引言&#xff1a; 1.日志的基本概念 1.1.什么是日志&#xff1f; 1.2.我们为什么需要日志&#xff1f; 2.自己实现一个简易日志 2.1.日志的等级 2.2日志的格式 2.3.获取时间的方法 2.4.日志的主体实现 参数&#xff1a; 代码解析&#xff1a; 问题&#xff1a…

【ssh 密钥生成】添加后提示无权限

记录下又一个感觉自己是菜菜的事件&#xff1b; 我根据教程在新电脑生成了 ssh 密匙&#xff0c;也在页面添加了ssh密匙&#xff1b; 但是下载代码的时候就提示权限不对&#xff0c;下载不下来&#xff1b; 百度了一堆办法&#xff0c;还是不行&#xff0c;然后大佬来&#…

solid wrok笔记记录

1.平移 crtl鼠标滚轮 2.放大缩小 鼠标滚轮滚动 3.旋转 按住鼠标滚轮 4.正视 右键 选择 5。多选 ctel 框选。。。 6. 选项卡 右上角空白处右键 7.草图&#xff0c;剪多余的线段(T),鼠标含住滑动去除 8.草图的线段掰直 选中线段后&#xff0c;左侧窗口的几…

【Scala入门学习】匹配模式match

1. match匹配 match 语句用在当需要从多个分支中进行选择的场景&#xff0c;类似于java 中的switch 语句。 语法&#xff1a; 变量 match{case "值" > 语句块1 // 语句块后不用加breakcase "值2" > 语句块2case _ > 语句块N // 类似于jav…