当前位置: 首页 > news >正文

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

文章目录

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

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

说明:

  • 数组是引用数据类型,数组的元素是同一类型的任何数据类型,包括基本数据类型和引用数据类型。
  • 数组的长度一旦确定,就不可变
  • 可以通过下标或索引的方式获取指定位置的元素(数组的下表是从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]);}
}

内存图解

在这里插入图片描述

数组练习

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

相关文章:

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

文章目录 一维数组声明初始化与赋值内存图解 二维数组声明初始化与赋值内存图解 数组练习 数组是多个相同类型的数据按一定顺序排列的集合。 说明&#xff1a; 数组是引用数据类型&#xff0c;数组的元素是同一类型的任何数据类型&#xff0c;包括基本数据类型和引用数据类型…...

Python爬虫抓取微博数据及热度预测

首先我们需要安装 requests 和 BeautifulSoup 库&#xff0c;可以使用以下命令进行安装&#xff1a; pip install requests pip install beautifulsoup4然后&#xff0c;我们需要导入 requests 和 BeautifulSoup 库&#xff1a; import requests from bs4 import BeautifulSou…...

Qt QTableWidget表格的宽度

默认值 QTableWIdget的表格宽度默认是一个给定值&#xff0c;可以手动调整每列的宽度&#xff0c;也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{"11","111111111111",&…...

OpenCV(opencv_apps)在ROS中的视频图像的应用(重点讲解哈里斯角点的检测)

1、引言 通过opencv_apps&#xff0c;你可以在ROS中以最简单的方式运行OpenCV提供的许多功能&#xff0c;也就是说&#xff0c;运行一个与功能相对应的launch启动文件&#xff0c;就可以跳过为OpenCV的许多功能编写OpenCV应用程序代码&#xff0c;非常的方便。 对于想熟悉每个…...

常见排序算法之插入排序类

插入排序&#xff0c;是一种简单直观的排序算法&#xff0c;工作原理是将一个记录插入到已经排好序的有序表中&#xff0c;从而形成一个新的、记录数增1的有序表。在实现过程中&#xff0c;它使用双层循环&#xff0c;外层循环对除了第一个元素之外的所有元素&#xff0c;内层循…...

Dubbo服务消费端远程调用过程剖析

1 Dubbo服务消费端远程调用过程概述 &#xff08;1&#xff09;当消费方调用远程服务的方法时&#xff0c;会被InvokerInvocationHandler拦截&#xff0c;执行其invoke()方法&#xff0c;创建RpcInvocation对象&#xff1b; &#xff08;2&#xff09;接着会选择远程调用的负…...

华硕荣获“EPEAT Climate+ Champion”永续先驱称号

华硕持续深耕永续理念&#xff0c;努力提供低碳排放、高效能产品&#xff0c;并被全球电子委员会授予“EPEAT Climate Champion”称号。这一荣誉再次表明了华硕在永续管理方面的承诺&#xff0c;并凸显了华硕在追求永续发展上的决心。 华硕通过设立“科学基础减碳目标”、“再生…...

基于QT使用OpenGL,加载obj模型,进行鼠标交互

目录 功能分析&#xff08;需求分析&#xff09;技术点分析OpenGL立即渲染模式可编程渲染管线模式 QOpenGLWidget派生类 glwidget逻辑glwidget.hglwidget.cpp 鼠标交互功能obj格式介绍 效果bunnyCayman_GT 功能分析&#xff08;需求分析&#xff09; 基于QT平台&#xff0c;使…...

三大赛题指南发布!2023 冬季波卡黑客松本周末开启 Workshop

2023 年一众黑客松赛事中&#xff0c;为什么我们建议您选择波卡黑客松大赛&#xff1f;或许答案在于——作为开发者极度友好的技术生态&#xff0c;波卡能够从参赛者的立场出发&#xff0c;为大家提供从 0 到 1 实现项目孵化成长的机会。这里聚集了一线技术专家的资源力量&…...

数据结构与算法(Java版) | 算法的空间复杂度简介

关于算法的空间复杂度&#xff0c;下面我给大家作一个简单介绍。 类似于时间复杂度的讨论&#xff0c;一个算法的空间复杂度&#xff08;Space Complexity&#xff09;定义为该算法所耗费的存储空间&#xff0c;同样&#xff0c;它也是问题规模n的一个函数。 其实&#xff0c…...

大数据-之LibrA数据库系统告警处理(ALM-12037 NTP服务器异常)

告警解释 当NTP服务器异常时产生该告警。 当NTP服务器异常消除时&#xff0c;该告警恢复。 告警属性 告警ID 告警级别 可自动清除 12037 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称。 RoleName 产生告警的角色名称。 HostName 异常N…...

烟草5G智慧工厂数字孪生可视化平台,赋能烟草工业数字化智慧转型

随着卷烟工厂提质增效需求增强&#xff0c;信息化建设推进及生产制造系统智能化改革发展&#xff0c;各生产单元逐步升级完善数字化&#xff0c;最终实现智能制造成为必然趋势。因此&#xff0c;5G卷烟加工工厂的数字化转型迫在眉睫。中国烟草制造行业正迈向全新的市场经济时代…...

PHP编写采集药品官方数据的程序

在 PHP 中编写爬虫程序&#xff0c;首先我们需要引入一些必要的库&#xff0c;如 curl 和 file_get_contents。然后&#xff0c;我们需要设置爬虫ip信息&#xff0c;以便我们可以从指定的爬虫ip服务器上获取数据。 // 引入必要的库 require_once curl.php;// 设置爬虫ip信息 $p…...

解决Jenkins执行git脚本时报错:No such device or address问题

问题现象&#xff1a; Jenkins执行BeanShell脚本时&#xff0c;报错&#xff1a;jenkins fatal: could not read Username for http://112.11.120.1: No such device or address 解决方案&#xff1a; 解决服务器拉取git仓库的代码权限&#xff0c;使用高级子模块克隆功能。…...

LCD英文字模库(16x8)模拟测试程序

字模 字模&#xff0c;就是把文字符号转换为LCD能识别的像素点阵信息。 电子发烧友可能都熟悉字模的用途。就是调用者通过向LCD模块发送字模数据&#xff0c;LCD根据字模数据在LCD面板上相应的像素描绘出图形或文字。 现在&#xff0c;大部分的LCD都内置了字模库&#xff0c…...

二分法

文章目录 二分法概述二分 > value最左的位置二分 < value最右的位置局部最小值问题 二分法概述 什么是二分法呢&#xff1f;相信大家都有所了解&#xff0c;举个最经典的二分的例子。 ​ 给定一个整型有序数组&#xff0c;和一个值 v a l u e value value&#xff0c;如…...

Linux文件类型与权限及其修改

后面我们写代码时&#xff0c;写完可能会出现没有执行权限什么的&#xff0c;所以我们要知道文件都有哪些权限和类型。 首先 就像我们之前目录结构图里面有个/dev,它就是存放设备文件的&#xff0c;也就是说&#xff0c;哪怕是一个硬件设备&#xff0c;例如打印机啥的&#xf…...

RPC 框架 openfeign 介绍和学习使用总结

一、基本概念 RPC 远程过程调用&#xff08;Remote Procedure Call&#xff09;的缩写形式 Birrell 和 Nelson 在 1984 发表于 ACM Transactions on Computer Systems 的论文《Implementing remote procedure calls》对 RPC 做了经典的诠释。 RPC 是指计算机 A 上的进程&am…...

大厂真题:【DP/贪心】字节跳动2023秋招-小红的 01 串

题目描述与示例 题目描述 小红拿到了一个 01 串&#xff0c;她准备将若干个字符1 染成红色&#xff0c;将若干个字符0 染成蓝色&#xff0c;但有个限制&#xff1a;如果一个0 和一个1 相邻&#xff0c;那么它们不能同时染色。 小红想知道&#xff0c;最多可以染多少个字符&a…...

【技术类-01】doc转PDF程序卡死的解决方案,

摘要&#xff1a; 1、报错&#xff1a; raise AttributeError("%s.%s" % (self._username_, attr))&#xff09; 2、表现&#xff1a;doc转PDF卡死&#xff08;白条不动或出现以上英文&#xff09; 3、解决&#xff1a;在docx保存代码行后面加上time.sleep(3) 4、…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...