Java基础——数组(一维数组与二维数组)

news2024/11/19 19:36:54

文章目录

  • 一维数组
    • 声明
    • 初始化与赋值
    • 内存图解
  • 二维数组
    • 声明
    • 初始化与赋值
    • 内存图解
  • 数组练习

数组是多个相同类型的数据按一定顺序排列的集合。

说明:

  • 数组是引用数据类型,数组的元素是同一类型的任何数据类型,包括基本数据类型和引用数据类型。
  • 数组的长度一旦确定,就不可变
  • 可以通过下标或索引的方式获取指定位置的元素(数组的下表是从0开始)。
  • 创建数组对象会在内存开辟一整块连续的空间,而数组名中引用的是这块连续空间的地址

一维数组

声明

  • 格式一
数据类型 数组名[];
  • 格式二(推荐)
数据类型[] 数组名;

初始化与赋值

  • 动态初始化:数组声明且为数组元素分配空间(未赋值,即默认值)
//声明并分配空间大小
int[] val = new int[3]; //未赋值的时候默认值为0
//赋值,通过指定数组下标赋值
val[0] = "10"; //下标从0开始
val[1] = "20";
val[2] = "30";
  • 静态初始化:在定义数组的同时给数组元素分配空间并赋值
//方式一
int[] temp = {15, 21}; //数组长度为2

//=============================================

//方式二
int[] temp = new int[]{3, 5, 7}; //数组长度为3

数组是引用类型,只要一经分配空间,其中的每个元素也被隐式初始化。对于基本数据类型数组,默认初始化值各不同(int默认为0),引用数据类型而言,默认初始化值为null。

示例:

//声明并初始化
int[] arr = new int[3];
//赋值
arr[0] = 3;
arr[1] = 5;
arr[2] = 9;
//打印输出
System.out.println(arr); //[I@4554617c 一维数组地址

如上代码所示,因为数组是引用数据类型,直接打印 arr 的结果是内存地址。

地址解析:[I@4554617c [表示一维数组,I表示int类型,@后面是地址值)。

图示:
在这里插入图片描述
若此时使用arr[3]=10;进行赋值,会发现数组分配空间不够,没有3下标的空间,就会出现ArrayIndexOutOfBoundsException异常。

注意:数组的大小一旦定义则不可变,则赋值和获取的数组下标不能超过或等于(因为从0下标开始)声明定义的数组大小,否则会出现ArrayIndexOutOfBoundsException异常。

若要获取数组元素的值,需要遍历该数组,通过数组下标获取。

for (int i = 0; i < arr.length; i++) {
     System.out.println(arr[i]);
}
//输出:3、5、9

内存图解

在这里插入图片描述

二维数组

二维数组可以看成是一个一维数组作为另一个一维数组的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。像数组的元素是数组,我们暂且称为元素数组

个人理解:
在这里插入图片描述

注意:数组不止二维,还可以是三维、四维……类似无限套娃。

声明

  • 格式一(推荐)
数据类型[][] 数组名;
  • 格式二
数据类型 数组名[][];
  • 格式三(不推荐)
数据类型[] 数组名[];

初始化与赋值

  • 动态初始化
//方式一
int[][] arr = new int[3][2]; //该二维数组中有3个一维数组,且每个一维数组中有2个元素数组(开头有约定名称),默认值为0
//打印输出
System.out.println(arr[0][0]); //输出:0
//赋值
arr[0][0] = 1;
//打印输出
System.out.println(arr[0][0]); //输出:1

//===================================================

//方式二
int[][] arr = new int[3][]; //该二维数组有3个一维数组,每个一维数组中的元素数组都是默认初始化值null
//初始化并赋值
arr[0] = new int[]{2, 4, 6};
//先初始化再赋值
arr[1] = new int[2];
arr[1][0] = 13;
//打印输出
System.out.println(arr[0][0]); //输出:2
System.out.println(arr[1][0]); //输出:13

注意:int[][] arr = new int[][3]; 非法。

  • 静态初始化
//方式一
int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

//================================================

//方式二
int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}}; //定义一个名称为arr的二维数组,二维数组中有三个一维数组
//获取元素值
System.out.println(arr[0]); //{3,8,2}

注意:静态初始化中每个一维数组中具体元素数组都已初始化并赋值。

示例:

//动态初始化方式一,数组长度为3,元素数组长度为1
int[][] arr = new int[3][1];
System.out.println(arr); //[[I@4554617c 二维数组地址
//赋值
arr[0][0] = 1;
arr[1][0] = 3;
arr[2][0] = 2;
System.out.println(arr[2][0]); //输出:2
System.out.println(arr[2]); //[I@74a14482 一维数组地址
arr[2][1] = 5; //ArrayIndexOutOfBoundsException指针越界异常,因为数组声明时定义了元素数组长度为1,上面arr[2]已经赋值0下标

地址解析:[[I@4554617c[[表示二维数组,I表示int类型,@后面是地址值)

注意:当引用的数组下标大于等于定义的数组长度,会出现ArrayIndexOutOfBoundsException指针越界异常。

图示:

在这里插入图片描述

//动态初始化方式二
int[][] temp = new int[3][];
System.out.println(temp); //[[I@4554617c 二维数组地址
System.out.println(temp[0]); //null
System.out.println(temp[0][0]); //NullPointerException空指针异常,因为元素temp[0]为null,而temp[0][0]是获取temp[0]数组下标为0的值
//元素初始化
temp[0] = new int[1]; //数组长度为1
temp[1] = new int[]{12, 4, 3}; //数组长度为3
//元素数组赋值
temp[0][0] = 10;
System.out.println(temp[0]); //[I@74a14482 一维数组地址
System.out.println(temp[0][0]); //输出:10
System.out.println(temp[1][0]); //输出:12

注意:当引用的数组元素是一个非基本数据类型且为null时,使用该元素引用会出现NullPointerException空指针异常。

图示:

在这里插入图片描述

动态初始化方式一和方式二的区别:

  1. 方式一在使用的时候不需要初始化元素,方式二需要初始化元素后再使用,否则会出现NullPointerException异常。
  2. 方式一元素数组的长度在声明初始化的时候就固定了,方式二元素数组在声明初始化的时候不固定。

若要获取数组元素的值,需要遍历该数组,通过数组下标获取。

int[][] arr = {{1, 2},{5, 9},{10, 11, 13}};
for (int i = 0; i < arr.length; i++) {
     int[] val = arr[i];
     for (int j = 0; j < val.length; j++) {
         System.out.println(val[j]);
     }
}

内存图解

在这里插入图片描述

数组练习

数组练习案例:杨辉三角、冒泡排序、二分查找等。

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

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

相关文章

基于YOLOv8的输电线路异物识别算法应用

基于 YOLOv8 的输电线路异物识别算法应用 输电线路作为电力系统的重要一环&#xff0c;保证其安全稳定运行是十分必要的。由于长期暴露于室外&#xff0c;线路所面临的不安全因素繁多&#xff0c;异物入侵便是其中之一。异物可能会引起线路短路甚至诱发火灾&#xff0c;因此要加…

使用3D Touch,让你左右逢源,操作更自然

本文介绍了如何在苹果设备上使用3D Touch&#xff0c;以及哪些应用程序支持该工具。3D Touch在Apple Watch上也称为Force Touch&#xff0c;在iPhone XR上也称为Haptic Touch。 如何改变3D触摸的灵敏度 按照以下步骤调整3D Touch的灵敏度&#xff1a; 1、打开“设置”应用程…

docker安装AWVS 23.9.231005181

本文声明仅AWVS用作学习使用 将镜像文件secfa_awvs.tar复制到目标机器上。 我的百度网盘文件路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1frbOH4UZlMz9bMXyZs1o0g 提取码&#xff1a;na6y –来自百度网盘超级会员V6的分享 在目标机器上&#xff0c;使用以下命…

原码补码相关运算

求补码步骤 原补转换 -127为负数&#xff0c;其补码为原码01111111&#xff0c;取反10000000&#xff0c;加一&#xff0c;10000001。 例如&#xff1a; 【-1】原码 10000001 反码bai11111110 补码duzhi 11111111 【3】原码 00000011 反码 00000011 补码 00000011 【-127】…

【多线程】

文章目录 概念一、线程的生命周期图二、线程的创建方式一方式二线程API线程优先级sleep阻塞守护线程多线程并发安全问题 总结 概念 线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的流程并发运行。造成"感官上…

算法——滑动窗口

什么是窗口&#xff1f;就是符合题目要求的区域内的数据&#xff0c;将每次符合数据的窗口内的数据记录下来&#xff0c;然后将窗口后移&#xff0c;寻找其他符合要求的数据&#xff0c;每次进入窗口和退出窗口都需要一定的要求 一、 LCR 008. 长度最小的子数组 - 力扣&#…

Git之分支与版本->课程目标及知识点的应用场景,分支的场景应用,标签的场景应用

1.课程目标及知识点的应用场景 Git分支和标签的命名规范 分支 dev/test/pre/pro(即master) dev:开发环境--windows (自己的电脑) test:测试环境--windows/linux (公司专门的测试电脑 pre:灰度环境(非常大的公司非常重要的项目) pro:正式环境 灰度环境与正式环境的服务器配置…

论文笔记:Deep Trajectory Recovery with Fine-Grained Calibration using Kalman Filter

TKDE 2021 1 intro 1.1 背景 用户轨迹数据对于改进以用户为中心的应用程序很有用 POI推荐城市规划路线规划由于设备和环境的限制&#xff0c;许多轨迹以低采样率记录 采样的轨迹无法详细说明物体的实际路线增加了轨迹中两个连续采样点之间的不确定性——>开发有效的算法以…

RK3588平台 WIFI的基本概念

一.安卓WIFI框架 Android WIFI系统引入了wpa_supplicant&#xff0c;它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。Android WIFI主要分为六大层&#xff0c;分别是WiFi Settings层&#xff0c;Wifi Framework层&#xff0c;Wifi JNI 层&#xff0c; W…

ARM Linux 基础学习 / Linux Shell,必要命令全记录

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…

高级项目管理总结

目录 一、背景介绍二、思路&方案三、过程1.升维思考2.结构化3.心理、知识阶段检验4.微观 四、总结 一、背景介绍 天性对学习对考试充满敌意的我&#xff0c;转变为依赖学习谋生&#xff0c;再到后来书中自有黄金屋&#xff0c;到现在学习对我而言就如同一日三餐&#xff1…

Unity - 各向异性 - 丝绸材质

文章目录 目的环境主观美术效果的[假]丝绸基于物理的方式ProjectPBR filament web captureReferences 目的 拾遗&#xff0c;备份 环境 Unity : 2020.3.37f1 Pipeline : Builtin Rendering Pipeline 主观美术效果的[假]丝绸 非常简单 : half specualr pow(1 - NdotV, _Edg…

【STM32】TIM2的PWM:脉冲宽度调制--标准库

注意点&#xff1a; TIM_Period---->指要进行比较的值Compare TIM_Prescaler----> 指要进行分频的值【分频值/原始时钟值】 PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 https://www.cnblogs.com/brianblog/p/7117896.html 0.通用寄存器输出 1.捕获/比较通道…

CountDownLatch和CyclicBarrier详解

1. CountDownLatch 1.1 简介 CountDownLatch 是 Java 中并发包&#xff08;java.util.concurrent&#xff09;提供的一种同步工具&#xff0c;用于在多线程环境中协调多个线程之间的执行顺序。它的作用是允许一个或多个线程等待其他线程完成操作。 CountDownLatch 通过一个计…

Python基础入门例程51-NP51 列表的最大与最小(循环语句)

最近的博文&#xff1a; Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 Python基础入门例程48-NP48 验证登录名与密码&#xff08;条件语句&#xff09;-CSDN博客 目录 最近的博文&…

深度解析CompletableFuture:Java 异步世界的奇迹

目录 概述 介绍 上文我们可知&#xff1a;CompletableFuture 是 Java 8 引入用于支持异步编程和非阻塞操作的类。对于没有使用过CompletableFuture通过它这么长的名字就感觉到一头雾水&#xff0c;那么现在我们来一起解读一下它的名字。 Completable&#xff1a;可完成Futur…

【Redis】Redis-Key的使用

上一篇&#xff1a; redis-server和redis-cli https://blog.csdn.net/m0_67930426/article/details/134361885?spm1001.2014.3001.5501 官网 命令 |雷迪斯 (redis.io) 设置key set name xxxxx 查看key keys * 再设置一个key并且查看 这里查看了两个key&#xff08;name a…

Git之分支与版本

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.开发测试上线git的使用 1.1. 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用…

《015.SpringBoot+vue之音乐网》【前后端分离】

《015.SpringBootvue之音乐网》【前后端分离】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisMySQL; 前台&#xff1a;Vue3.0 TypeScript Vue-Router Vuex Axios …

Globalsign证书

GlobalSign是全球可信的数字证书提供商之一&#xff0c;提供广泛的证书服务&#xff0c;包括SSL证书、代码签名证书、电子邮件证书等&#xff0c;帮助保护企业和个人的网络安全。本文将详细介绍GlobalSign证书的特点和优势&#xff0c;帮助您更好地了解这一重要的数字证书提供商…