百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

java程序员必备的基础知识之数组的定义和使用

liuian 2025-01-14 15:20 39 浏览

如果希望保存一组有相同类型的数据,可以使用数组。

数组的定义和内存分配

Java 中定义数组的语法有两种:

type arrayName[];

type[] arrayName;

type 为Java中的任意数据类型,包括基本类型和组合类型,arrayName为数组名,必须是一个合法的标识符,[ ] 指明该变量是一个数组类型变量。例如:

1. int demoArray[];

2. int[] demoArray;

这两种形式没有区别,使用效果完全一样,读者可根据自己的编程习惯选择。

与C、C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度。而且对于如上定义的一个数组是不能访问它的任何元素的,我们必须要为它分配内存空间,这时要用到运算符new,其格式如下:

arrayName=new type[arraySize];

其中,arraySize 为数组的长度,type 为数组的类型。如:

复制纯文本新窗口

1. demoArray=new int[3];

为一个整型数组分配3个int 型整数所占据的内存空间。

通常,你可以在定义的同时分配空间,语法为:

type arrayName[] = new type[arraySize];

例如:

1. int demoArray[] = new int[3];

数组的初始化

你可以在声明数组的同时进行初始化(静态初始化),也可以在声明以后进行初始化(动态初始化)。例如:

1. // 静态初始化

2. // 静态初始化的同时就为数组元素分配空间并赋值

3. int intArray[] = {1,2,3,4};

4. String stringArray[] = {"微学苑", "http://www.weixueyuan.net", "一切编程语言都是纸老虎"};

5.

6. // 动态初始化

7. float floatArray[] = new float[3];

8. floatArray[0] = 1.0f;

9. floatArray[1] = 132.63f;

10. floatArray[2] = 100F;

数组引用

可以通过下标来引用数组:

arrayName[index];

与C、C++不同,Java对数组元素要进行越界检查以保证安全性。

每个数组都有一个length属性来指明它的长度,例如 intArray.length 指明数组 intArray 的长度。

【示例】写一段代码,要求输入任意5个整数,输出它们的和。

1. import java.util.*;

2. public class Demo {

3. public static void main(String[] args){

4. int intArray[] = new int[5];

5. long total = 0;

6. int len = intArray.length;

7.

8. // 给数组元素赋值

9. System.out.print("请输入" + len + "个整数,以空格为分隔:");

10. Scanner sc = new Scanner(System.in);

11. for(int i=0; i<len; i++){

12. intArray = sc.nextInt();

13. }

14.

15. // 计算数组元素的和

16. for(int i=0; i<len; i++){

17. total += intArray;

18. }

19.

20. System.out.println("所有数组元素的和为:" + total);

21. }

22. }

运行结果:

请输入5个整数,以空格为分隔:10 20 15 25 50

所有数组元素的和为:120

数组的遍历

实际开发中,经常需要遍历数组以获取数组中的每一个元素。最容易想到的方法是for循环,例如:

1. int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};

2. for(int i=0,len=arrayDemo.length; i<len; i++){

3. System.out.println(arrayDemo + ", ");

4. }

输出结果:

1, 2, 4, 7, 9, 192, 100,

不过,Java提供了”增强版“的for循环,专门用来遍历数组,语法为:

1. for( arrayType varName: arrayName ){

2. // Some Code

3. }

arrayType 为数组类型(也是数组元素的类型);varName 是用来保存当前元素的变量,每次循环它的值都会改变;arrayName 为数组名称。

每循环一次,就会获取数组中下一个元素的值,保存到 varName 变量,直到数组结束。即,第一次循环 varName 的值为第0个元素,第二次循环为第1个元素......例如:

1. int arrayDemo[] = {1, 2, 4, 7, 9, 192, 100};

2. for(int x: arrayDemo){

3. System.out.println(x + ", ");

4. }

输出结果与上面相同。

这种增强版的for循环也被称为”foreach循环“,它是普通for循环语句的特殊简化版。所有的foreach循环都可以被改写成for循环。

但是,如果你希望使用数组的索引,那么增强版的 for 循环无法做到。

二维数组

二维数组的声明、初始化和引用与一维数组相似:

1. int intArray[ ][ ] = { {1,2}, {2,3}, {4,5} };

2. int a[ ][ ] = new int[2][3];

3. a[0][0] = 12;

4. a[0][1] = 34;

5. // ......

6. a[1][2] = 93;

java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。例如:

1. int intArray[ ][ ] = { {1,2}, {2,3}, {3,4,5} };

2. int a[ ][ ] = new int[2][ ];

3. a[0] = new int[3];

4. a[1] = new int[5];

【示例】通过二维数组计算两个矩阵的乘积。

1. public class Demo {

2. public static void main(String[] args){

3. // 第一个矩阵(动态初始化一个二维数组)

4. int a[][] = new int[2][3];

5. // 第二个矩阵(静态初始化一个二维数组)

6. int b[][] = { {1,5,2,8}, {5,9,10,-3}, {2,7,-5,-18} };

7. // 结果矩阵

8. int c[][] = new int[2][4];

9.

10. // 初始化第一个矩阵

11. for(int i=0; i<2; i++)

12. for(int j=0; j<3 ;j++)

13. a[j] = (i+1) * (j+2);

14.

15. // 计算矩阵乘积

16. for (int i=0; i<2; i++){

17. for (int j=0; j<4; j++){

18. c[j]=0;

19. for(int k=0; k<3; k++)

20. c[j] += a[k] * b[k][j];

21. }

22. }

23.

24. // 输出结算结果

25. for(int i=0; i<2; i++){

26. for (int j=0; j<4; j++)

27. System.out.printf("%-5d", c[j]);

28. System.out.println();

29. }

30. }

31. }

运行结果:

25 65 14 -65

50 130 28 -130

几点说明:

· 上面讲的是静态数组。静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。

· 如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组)或向量(Vector)。

· 正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 或 Vector 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。

相关推荐

eino v0.4.5版本深度解析:接口类型处理优化与错误机制全面升级

近日,eino框架发布了v0.4.5版本,该版本在错误处理、类型安全、流处理机制以及代理配置注释等方面进行了多项优化与修复。本次更新共包含6个提交,涉及10个文件的修改,由2位贡献者共同完成。本文将详...

SpringBoot异常处理_springboot异常注解

在SpringBoot中,异常处理是构建健壮、可维护Web应用的关键部分。良好的异常处理机制可以统一返回格式、提升用户体验、便于调试和监控。以下是SpringBoot中处理异常的完整指...

Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)

这回对线上容器服务器的流水线进行了一定的改造来满足目前线上的需求,还是会将所有的自动化脚本都放置到代码库中统一管理,我感觉一章不一定写的完,所以先给标题加了个-1,话不多说开干1.本次流水线的流程设计...

告别宕机!零基础搭建服务器监控告警系统!小白也能学会!

前言本文将带你从零开始,一步步搭建一个完整的服务器指标监控与邮件告警系统,使用的技术栈均为业界主流、稳定可靠的开源工具:Prometheus:云原生时代的监控王者,擅长指标采集与告警规则定义Node_...

httprunner实战接口测试笔记,拿走不谢

每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试码同学抖音号:小码哥聊软件测试01开始安装跟创建项目pipinstallhttprunne...

基于JMeter的性能压测平台实现_jmeter压测方案

这篇文章已经是两年前写的,短短两年时间,JMeter开源应用技术的发展已经是翻天覆地,最初由github开源项目zyanycall/stressTestPlatform形成的这款测试工具也开始慢...

12K+ Star!新一代的开源持续测试工具!

大家好,我是Java陈序员。在企业软件研发的持续交付流程中,测试环节往往是影响效率的关键瓶颈,用例管理混乱、接口调试复杂、团队协作不畅、与DevOps流程脱节等问题都能影响软件交付。今天,给大家...

Spring Boot3 中分库分表之后如何合并查询

在当今互联网应用飞速发展的时代,数据量呈爆发式增长。对于互联网软件开发人员而言,如何高效管理和查询海量数据成为了一项关键挑战。分库分表技术应运而生,它能有效缓解单库单表数据量过大带来的性能瓶颈。而在...

离线在docker镜像方式部署ragflow0.17.2

经常项目上会出现不能连外网的情况,要怎么使用ragflow镜像部署呢,这里提供详细的步骤。1、下载基础镜像根据docker-compose-base.yml及docker-compose.yml中的i...

看,教你手写一个最简单的SpringBoot Starter

何为Starter?想必大家都使用过SpringBoot,在SpringBoot项目中,使用最多的无非就是各种各样的Starter了。那何为Starter呢?你可以理解为一个可拔插式...

《群星stellaris》军事基地跳出怎么办?解决方法一览

《群星stellaris》军事基地跳出情况有些小伙伴出现过这种情况,究竟该怎么解决呢?玩家“gmjdadk”分享的自己的解决方法,看看能不能解决。我用英文原版、德语、法语和俄语四个版本对比了一下,结果...

数据开发工具dbt手拉手教程-03.定义数据源模型

本章节介绍在dbt项目中,如何定义数据源模型。定义并引入数据源通过Extract和Load方式加载到仓库中的数据,可以使用dbt中的sources组件进行定义和描述。通过在dbt中将这些数据集(表)声...

docker compose 常用命令手册_docker-compose init

以下是DockerCompose常用命令手册,按生命周期管理、服务运维、构建配置、扩缩容、调试工具分类,附带参数解析、示例和关键说明,覆盖多容器编排核心场景:一、生命周期管理(核心命令...

RagFlow与DeepSeek R1本地知识库搭建详细步骤及代码实现

一、环境准备硬件要求独立显卡(建议NVIDIAGPU,8GB显存以上)内存16GB以上,推荐32GB(处理大规模文档时更高效)SSD硬盘(加速文档解析与检索)软件安装bash#必装组件Docker...

Docker Compose 配置更新指南_docker-compose配置

高效管理容器配置变更的最佳实践方法重启范围保留数据卷适用场景docker-composeup-d变更的服务常规配置更新--force-recreate指定/所有服务强制重建down→up流程...