Java学习五—数组

一、关于数组

1.1简介

在Java中,数组是一种特殊的对象,用于存储固定大小的相同类型的元素。数组可以存储基本数据类型(如int、char、boolean等)或对象引用。

1.2背景

我们可以想一个问题,如果现在让你存储100个学生的数学成绩,你该怎么存储呢?难道要定义100个变量,每个变量代表一个学生的成绩吗?如果是存储1000个、10000个、乃至更多学生的成绩怎么办?

如果是定义一个个变量进行存储,就太麻烦了,而且这也不符合项目开发时对复用性、可读性等方面的要求。所以我们肯定不能这么编程。那么现在解决的办法,就是可以使用”数组“来进行实现。

给大家举个栗子,下图的这个东西你见过吗?

8d6da651-c6cf-4ddb-b63f-8ba62b6fc55f

这是存储这些鸡蛋的”容器“–鸡蛋托!一个鸡蛋托有多个存储格子,每个格子只能存储一个鸡蛋,并且这些格子只能用来存储鸡蛋,不能存储其他的东西。一个鸡蛋托可以存储的鸡蛋数量是有限的,不能无限存储。

其实Java里的数组就类似于是”鸡蛋托“,数组中存储的数据元素就是一个个的”鸡蛋“。一个数组占据了内存中的一片连续空间,只能存储相同类型的数据,数组有一定的存储空间。我们在创建数组时,需要先声明数组的类型,之后该数组中只能存储指定类型的数据。

  • 我们把存储在数组中的每一个数据,称为”数据元素“。这些数据元素会按着一定的顺序排列存储,并赋予每个数据元素对应的编号。我们可以直接通过编号(索引、下标)的方式来调用指定位置上的数据元素,查找速度会很快。
  • 数组本身是引用类型,但数组中的数据元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 数组创建时需要指定一个名称,并会在内存中开辟一整块连续的内存空间,数组名引用的就是这块连续空间的首地址(第一个地址)。
  • 数组创建后,长度一旦确定,就不能再被修改。

二、数组的声明和初始化

在 Java 中,要使用数组,首先需要声明和初始化它。声明一个数组只是告诉编译器你将要使用一个数组,但并不分配内存空间。初始化数组是为数组分配实际的内存,并为数组的元素赋初值。

2.1数组的声明

要声明一个数组,你需要指定数组的类型,后面跟着数组名字和一对方括号 []​,例如:

int[] numbers; // 声明一个整数数组

以上代码声明了一个名为“numbers”的整数数组

可以在声明时为数组分配内存,例如:

int[] numbers = new int[5]; // 声明并分配一个包含 5 个整数的数组

2.2数组的初始化

初始化数组是为数组分配内存并赋予初始值。Java 中有几种初始化数组的方式。

直接初始化

你可以在声明数组的同时为数组分配内存并赋值,例如:

int[] numbers = {1, 2, 3, 4, 5}; // 直接初始化一个整数数组

示例:

image-20230513210105874

使用循环初始化

你也可以使用循环来初始化数组,例如:

int[] numbers = new int[5]; // 声明一个包含 5 个整数的数组
for (int i = 0; i < 5; i++) {numbers[i] = i + 1;
}

2.3访问数组元素

访问数组元素是指通过数组的索引来获取数组中的值。在 Java 中,数组的索引从 0 开始,因此第一个元素的索引是 0,第二个元素的索引是 1,以此类推。

例如,要访问上面示例中的 numbers​ 数组的第一个元素,可以使用以下代码:

int firstNumber = numbers[0]; // 获取第一个元素的值,即 1

2.4数组的长度

要获取数组的长度(即数组中元素的个数),可以使用数组的 length​ 属性,例如:

int length = numbers.length; // 获取数组 numbers 的长度,即 5

三、遍历数组

遍历数组是指逐个访问数组中的所有元素,通常使用循环来实现。在 Java 中,常用的循环有 for​​ 循环和 foreach​​ 循环

3.1使用 for 循环遍历数组

使用 for​ 循环可以遍历数组的所有元素,例如:

int[] numbers = {1, 2, 3, 4, 5};for (int i = 0; i < numbers.length; i++) {System.out.println(numbers[i]); // 输出数组元素
}

3.2使用 foreach 循环遍历数组

Java 5 引入了 foreach 循环,可以更简洁地遍历数组,例如:

int[] numbers = {1, 2, 3, 4, 5};for (int number : numbers) {System.out.println(number); // 输出数组元素
}

foreach​ 循环适用于遍历整个数组,但不能改变数组元素的值。

四、数组的常见操作

除了声明、初始化和遍历数组,数组还支持许多常见的操作,如添加元素、删除元素、查找元素等。以下是一些常见的数组操作:

4.1添加元素

要向数组添加元素,需要先创建一个新的数组,然后将原数组的元素复制到新数组中,并在新数组中添加新元素。Java 中的数组大小是固定的,所以添加元素通常需要创建一个新数组。

// 原始数组
int[] originalArray = {1, 2, 3, 4, 5};// 新增元素后的长度
int newLength = originalArray.length + 1;// 创建新数组
int[] newArray = new int[newLength];// 将原始数组中的元素复制到新数组中
for (int i = 0; i < originalArray.length; i++) {newArray[i] = originalArray[i];
}// 添加新元素到新数组的末尾
int newElement = 6;
newArray[newLength - 1] = newElement;// 新数组现在包含了原始数组的所有元素,并且增加了一个新元素

4.2删除元素

删除数组中的元素通常也需要创建一个新数组,将原数组中不需要删除的元素复制到新数组中。要删除元素,通过找到要删除的元素的索引,然后将其跳过。以下是一个删除数组元素的示例:

// 原始数组
int[] originalArray = {1, 2, 3, 4, 5};// 要删除的元素的索引
int indexToRemove = 2; // 假设要删除索引为2的元素(即值为3的元素)// 新数组的长度
int newLength = originalArray.length - 1;// 创建新数组
int[] newArray = new int[newLength];// 复制原数组中不需要删除的元素到新数组中
for (int i = 0, j = 0; i < originalArray.length; i++) {if (i != indexToRemove) {newArray[j] = originalArray[i];j++;}
}// 新数组现在包含了原始数组中除了要删除元素之外的所有元素

4.3查找元素

要在数组中查找元素,可以使用循环遍历数组,逐个比较每个元素的值,找到匹配的元素后返回索引或值。以下是一个查找元素的示例:

// 给定数组
int[] myArray = {10, 20, 30, 40, 50};// 要查找的元素
int elementToFind = 30;// 使用循环遍历数组,查找元素
boolean found = false;
for (int i = 0; i < myArray.length; i++) {if (myArray[i] == elementToFind) {found = true;System.out.println("元素 " + elementToFind + " 在数组中的索引为:" + i);break;}
}if (!found) {System.out.println("元素 " + elementToFind + " 不在数组中");
}

4.4排序

image-20230513234703840

冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,依次比较相邻的两个元素,并将它们按照要求交换位置,直到整个数组有序为止。这个过程就像气泡在水中逐渐上升一样,故称为冒泡排序。

冒泡排序的基本思路是,每一轮比较相邻的两个元素,如果它们的顺序不符合要求,则交换它们的位置,直到所有元素都排好序为止。

image-20230513234752548

示例

public class BubbleSortExample {public static void main(String[] args) {int[] arr = {4, 2, 7, 1, 5};bubbleSort(arr);System.out.println("排序后的数组:");for (int num : arr) {System.out.print(num + " ");}}public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换位置int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}

五、数组工具类:Arrays

在Java中,java.util.Arrays​是一个工具类,提供了各种用于操作数组的静态方法。这个工具类包含了许多有用的方法,例如对数组进行排序、搜索、比较以及填充等操作。下面简要介绍一些java.util.Arrays​类中常用的方法:

  1. sort(T[] a): 对指定数组进行排序。根据元素的自然顺序进行升序排序。
  2. binarySearch(T[] a, T key): 使用二分查找算法在指定数组中搜索指定的元素。数组必须是有序的。
  3. copyOf(T[] original, int newLength): 复制指定数组的指定长度。
  4. equals(T[] a, T[] a2): 比较两个数组是否相等。
  5. fill(T[] a, T val): 将指定值填充到数组中的每一个元素。
  6. asList(T... a): 返回一个固定大小的列表,支持更改(add/remove)操作。
  7. toString(T[] a): 返回一个包含数组元素的字符串表示形式。
  8. deepEquals(Object[] a1, Object[] a2): 深度比较两个对象数组是否相等。
  9. stream(T[] array): 将数组转换为Stream对象。

这些方法提供了方便且高效的方式来操作数组,避免了手动编写很多重复的代码。使用java.util.Arrays​类可以简化对数组的处理,提高代码的可读性和可维护性。不过需要注意的是,java.util.Arrays​类中的方法都是针对对象数组的,对于基本数据类型的数组,需要使用对应的装箱类型(如Integer[]​代替int[]​)来调用这些方法。

5.1Arrays.toString()

返回一个包含数组元素的字符串表示形式。

package com.song.array;import java.util.Arrays;public class ArrayDemo10 {public static void main(String[] args) {int[] a = {10,20,30,40,50};//System.out.println(a);//这样输出结果为 [I@1b6d3586//不能直接这样输出,直接打印数组元素可以用Arrays.toString//打印数组元素Array.toStringSystem.out.println(Arrays.toString(a));}
}

运行后显示

image

5.2Arrays.fill()

将指定值填充到数组中的每一个元素

package com.song.array;import java.util.Arrays;public class ArrayDemo11 {public static void main(String[] args) {int[] a = new int[10];//填充数组元素 Arrays.fillArrays.fill(a,5);//打印数组元素 Arrays.toStringSystem.out.print(Arrays.toString(a));}
}

运行后显示:

image

5.3Arrays.sort( )

package com.song.array;import java.util.Arrays;public class ArrayDemo12 {public static void main(String[] args) {int[] a = {10,153,12,45,156,16,41,19};//给数组进行排序:升序Arrays.sort(a);//打印数组元素System.out.print(Arrays.toString(a));}
}

运行后显示:

image

5.4Arrays.equals(a , b )

通过equals方法比较数组中元素值是否相等。

package com.song.array;import java.util.Arrays;public class ArrayDemo14 {public static void main(String[] args) {//定义几个数组int[] a = {1,2,3};int[] b = {1,2,3};int[] c = {4,5,6};if (Arrays.equals(a,b)){System.out.println("a等于b");} else {System.out.println("a不等于b");}if (Arrays.equals(a,c)){System.out.println("a等于c");} else {System.out.println("a不等于c");}}
}

运行后显示:

image

5.5Arrays.binarySearch(a , 12 )

通过binarySearch方法能对排序好的数组进行二分查找法操作。

package com.song.array;import java.util.Arrays;public class ArrayDemo13 {public static void main(String[] args) {int[] a = {10,153,12,45,156,10,41,19};Arrays.sort(a);//将数组a进行排序:升序//操作Arrays.binarySearch前必须先将数组进行升序//升序后的数组 a: [10, 10 ,12 ,19 ,41 ,45 ,153 ,156]int i = Arrays.binarySearch(a,12);//查找数组a中12的下标System.out.print("12的下标为"+i);//输出12的下标}
}

运行后显示:

image

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

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

相关文章

openKylin系统安装ssh服务结合内网穿透实现固定公网地址访问

文章目录 1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接小结 6. 固定SSH公网地址7. SSH固定地址连接 openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff0c;打造具有自…

VR历史建筑漫游介绍|虚拟现实体验店加盟|VR设备购买

VR历史建筑漫游是一种利用虚拟现实技术&#xff0c;让用户可以身临其境地参观和探索历史建筑的体验。通过VR头显和相关设备&#xff0c;用户可以在虚拟环境中自由移动和互动&#xff0c;感受历史建筑的真实氛围和文化内涵。 在VR历史建筑漫游中&#xff0c;您可以选择不同的历史…

文心一言赋能问卷生成,打造高效问卷调研工具

当前&#xff0c;各种大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;井喷式发展&#xff0c;基于LLM的应用也不断涌现。但是&#xff0c;当开发者基于LLM开发下游应用时&#xff0c;LLM直接生成的结果在格式、内容等方面都存在许多不确定因素&#xf…

【办公类-22-15】周计划系列(5-6)“周计划-06 周计划打印pdf(docx删除内容转PDF)“ (2024年调整版本)

作品展示 背景需求&#xff1a; 前期用docx&#xff08;删除第一页反思部分内容&#xff09;转PDF转png&#xff08;第一页&#xff09;的方式获得上传网页用的图片。 【办公类-22-14】周计划系列&#xff08;5-5&#xff09;“周计划-05 上传周计划png&#xff08;docx转PDF…

汽车功能安全整体方法

摘 要 ISO26262道路车辆功能安全标准已经制定实践了多年&#xff0c;主要目标是应对车辆的电子和电气&#xff08;E/E&#xff09;系统失效。该方法践行至今&#xff0c;有些系统功能安全方法已经成熟&#xff0c;例如电池管理系统&#xff08;BMS&#xff09;&#xff0c;并且…

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…

win32汇编弹出对话框

之前书上有一个win32 asm 的odbc例子&#xff0c;它有一个窗体&#xff0c;可以执行sql&#xff1b;下面看一下弹出一个录入数据的对话框&#xff1b; 之前它在.code段包含2个单独的asm文件&#xff0c;增加第三个&#xff0c;增加的这个里面是弹出对话框的窗口过程&#xff0…

一文快速掌握docker的理念和基本使用

写在文章开头 写于一个周末&#xff0c;在复盘梳理文章时候发现这一篇关于早期了解docker时记录的文档&#xff0c;仔细阅读了一下&#xff0c;为了保证文章更加清晰以便读者使用。故再次重新一次梳理一次&#xff0c;通过这篇文章&#xff0c;你将会对docker的基本理念和基础…

MATLAB的使用(一)

一&#xff0c;MATLAB的编程特点 a,语法高度简化&#xff1b; b,脚本式解释型语言&#xff1b; c,针对矩阵的高性能运算&#xff1b; d,丰富的函数工具箱支持&#xff1b; e,通过matlab本体构建跨平台&#xff1b; 二&#xff0c;MATLAB的界面 工具栏:提供快捷操作编辑器…

window 查看特定端口占用并停掉

要查看Windows上特定端口的占用情况并停止相关进程&#xff0c;你可以使用以下步骤&#xff1a; 查看端口占用&#xff1a; 首先&#xff0c;你可以使用netstat命令来查看特定端口的占用情况。假设你想要查看端口号为8080的情况&#xff0c;你可以运行以下命令&#xff1a; net…

Unity类银河恶魔城学习记录10-14 p102 Applying damage to skills and clean up源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic;…

Jenkins流水线将制品发布到Nexus存储库

1、安装jenkins&#xff08;建议别用docker安装&#xff0c;坑太多&#xff09; docker run -d -p 8089:8080 -p 10241:50000 -v /var/jenkins_workspace:/var/jenkins_home -v /etc/localtime:/etc/localtime --name my_jenkins --userroot jenkins/jenkins:2.449 坑1 打开x…