Java数组:没错,不装了我就是书架。

在这里插入图片描述

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、数组的概念
    • 1、什么是数组?
    • 2、数组的创建
    • 3、数组的初始化
      • Ⅰ、动态初始化
      • Ⅱ、静态初始化
  • 二、数组的使用
    • 1、数组中元素的访问
    • 2、数组的遍历
      • Ⅰ、`for`循环遍历
      • Ⅱ、`for-each`遍历
    • 3、数组的拷贝
  • 三、数组是引用类型
    • 1、`JVM`的内存分布
    • 2、引用类型
    • 3、引用变量
  • 四、数组的应用
    • 1、存储数据
    • 2、作为函数的参数
      • Ⅰ、参数传数组类型
      • Ⅱ、作函数返回值
  • 五、二维数组

嘿!你家有书架吗?想象一下你的书架上摆放了许多书籍📚,现在你想要整理一组相关的书籍,比如一套百科全书或一组小说。你会为这组书籍在书架上留出一个特定的区域,便于集中管理。在Java中,数组就像书架上的一排书籍一样,数组中的每个元素都有一个唯一的位置,我们可以通过索引或位置来访问它们。下面让我们一起学习数组吧。
在这里插入图片描述


一、数组的概念

1、什么是数组?

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

比如:下方的书架,每个区域都有自己的编号。就像下图中连在一起的4个书架

  • 数组中存放的元素其类型相同(每个书架上的书籍类型相同)

  • 数组的空间是连在一起的(每个书架都是挨在一起的)

  • 每个空间有自己的编号,其实位置的编号为0,即数组的下标(每个书架下面都有编号,编号是连续的)

在这里插入图片描述

2、数组的创建

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

T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度

String[] chineseNovel = new String[4];

例如这段代码,创建了一个数组类型为字符串类型,数组名叫做中国小说,数组(书架)里面有四个格子。

值得注意的是,一旦创建了数组(书架),就不能再改变它的大小!

在 Java中数组是对象,不是基本数据类型(原生类),大小不可变且连续存储,因为是对象所以存储在堆空间中。

数组长度在创建时就确定了,要改变数组长度只能重新创建新的数组,将原有数组复制到新的数组之中。这也是ArrayList扩容时候的效率低于LinkedList的原因。

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

3、数组的初始化

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

Ⅰ、动态初始化

在这里插入图片描述

数组的动态初始化是指在创建数组时只指定数组的长度而不提供具体的元素值。这意味着数组的元素在创建时会被赋予默认值,对于数值类型,这个默认值通常为0,对于引用类型(如对象数组),默认值为null

数据类型默认值
byte0
short0
int0
long0L
float0.0f
double0.0d
char‘\u0000’
booleanfalse
引用类型null
int[] array = new int[10];

此时,没有给数组赋值,所以开辟的数组空间中的初始值全部为0
image-20230630113314320

Ⅱ、静态初始化

数组的静态初始化是在创建数组时就为数组元素指定具体的初始值。这是通过在声明数组的同时提供数组元素的值的方式来实现的。
在这里插入图片描述
换句话说,静态初始化,就你是在买书架的时候,书架上已经放上了对应的书了。

T[] 数组名称 = {data1, data2, data3, ..., datan};
int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] chineseNovel = new String[]{"三国演义","水浒传","西游记","红楼梦"};

【注意事项】

  • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度

  • 静态初始化时, {}中数据类型必须与[]前数据类型一致

  • 静态初始化可以简写,省去后面的new T[]

二、数组的使用

1、数组中元素的访问

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

还记得前面的的书架吗?比如我现在要找水浒传,我就可以说:给我中国小说书架上的01号书。

在这里插入图片描述

    public static void main(String[] args) {String[] chineseNovel = new String[]{"三国演义","水浒传","西游记","红楼梦"};System.out.println(chineseNovel[1]);}

在这里插入图片描述
换成其他的书架也是一样。

    public static void main(String[] args) {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]);}

在这里插入图片描述
注意事项

  • 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素

  • 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常

2、数组的遍历

在这里插入图片描述
“遍历” 是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作(比如:打印)

    public static void main(String[] args) {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]);}

Ⅰ、for循环遍历

前面的代码确实可以起到对数组中元素遍历的目的,但问题是:

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

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

    public static void main(String[] args) {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 来获取数组的长度

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

Ⅱ、for-each遍历

    public static void main(String[] args) {int[] array = new int[]{10, 20, 30, 40, 50};for (int x : array) {System.out.println(x);}}

图片描述

for-each循环(也被称为增强型for循环)是一种简化迭代集合(如数组、ListSet等)

for-each循环提供了一种更简洁、易读的方式来遍历集合元素。

for (Type Name : collection) {// 代码块
}

Type:表示集合中元素的类型。
Name:是一个临时变量,用于在每次迭代中存储集合中的当前元素。
collection:要遍历的集合。

如果需要处理一个集合中的所有元素,可以用for each循环语句对传统循环语句进行改进。

3、数组的拷贝

Java 中Arrays.copyOf 可以用于复制原数组,返回一个新的数组,并且这个新数组可以选择一个新的长度。

int new_array = Arrays.copyOf(array,new_length);
  • array:原数组。
  • new_length:新数组的长度。
  • 如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,那么多余元素将被赋值为false
    public static void main(String[] args) {int[] array1 = new int[5];for (int i = 0; i < array1.length; i++) {array1[i] = i;}int[] array2 = Arrays.copyOf(array1,array1.length*2);for (int x:array2) {System.out.print(x+" ");}}

三、数组是引用类型

1、JVM的内存分布

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

  • 程序运行时代码需要加载到内存

  • 程序运行产生的中间数据要存放在内存

  • 程序中的常量也要保存

  • 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦。因此JVM也对所使用的内存按照功能的不同进行了划分:
image-20230630115630312
程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址

虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表操作数栈动态链接返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了

本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。

堆(Heap): JVM所管理的最大内存区域。使用new创建的对象都是在堆上保存堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。

方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法编译出的的字节码就是保存在这个区域。

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是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。

图片描述

从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。这个有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

3、引用变量

public static void func() {int[] array1 = new int[3];array1[0] = 10;array1[1] = 20;array1[2] = 30;int[] array2 = new int[]{1,2,3,4,5};array2[0] = 100;array2[1] = 200;array1 = array2;array1[2] = 300;array1[3] = 400;array2[4] = 500;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}
}

image-20230630161029934

image-20230630161036099引用变量其实就是一个变量,不过他存储的是一个对象的内存地址。

图片描述

四、数组的应用

1、存储数据

public static void main(String[] args) {int[] array = {1, 2, 3};for(int i = 0; i < array.length; ++i){System.out.println(array[i] + " ");}
}

int[] array = {1, 2, 3}; 代表着array里面存着1,2,3 三条数据。

2、作为函数的参数

Ⅰ、参数传数组类型

 public static void print(int[] array){array[0] = 8;for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");}}public static void main(String[] args){int[] array = {1,2,3,4,5};print(array);}

发现在print方法内部修改数组的内容,方法外部的数组内容也发生改变。因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。

总结:所谓的 “引用” 本质上只是存了一个地址。 Java 将数组设定成引用类型,这样的话后续进行数组参数传参,其实只是将数组的地址传入到函数形参中。这样可以避免对整个数组的拷贝(数组可能比较长,那么拷贝开销就会很大)

Ⅱ、作函数返回值

    public static int[] func(){int a = 111;int b = 222;return new int[]{a,b};}public static void main(String[] args){int[] array = func();for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");}}

例如:写一个方法myToString,传入一个数组的时候以字符串的方式进行打印

    public static String myToString(int[] array) {if(array==null)return "null";String s = "[";for (int i = 0; i < array.length; i++) {s+=array[i];if(i!= array.length-1)s+=",";}s+="]";return s;}public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5, 6};int[] array2 = null;String ret = myToString(array);String ret2 = myToString(array2);System.out.println(ret);System.out.println(ret2);}

在这里插入图片描述

五、二维数组

二维数组本质上就是一维数组,只不过每个元素又是一个一维数组。这使得我们可以使用行和列的方式来组织和访问数据。

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };
    public static void main(String[] args) {int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};for (int row = 0; row < arr.length; row++) {for (int col = 0; col < arr[row].length; col++) {System.out.printf("%d\t", arr[row][col]);}System.out.println("");}}

在这里插入图片描述
二维数组的用法和一维数组并没有明显差别。同理, 还存在 “三维数组”, “四维数组” 等更复杂的数组, 只不过出现频率都很低。


今天就先聊到这里啦,希望看完这篇文章,你能学会Java数组。我们下次再见!

在这里插入图片描述

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

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

相关文章

Windows系统上使用CLion远程开发Linux程序

CLion远程开发Linux程序 情景说明Ubuntu配置CLion配置同步 情景说明 在Windows系统上使用CLion开发Linux程序&#xff0c;安装CLion集成化开发环境时会自动安装cmake、mingw&#xff0c;代码提示功能也比较友好。 但是在socket开发时&#xff0c;包含sys/socket.h头文件时&am…

【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类

第三章&#xff0c;评估输入-分类 如果您正在构建一个允许用户输入信息的系统&#xff0c;首先要确保人们在负责任地使用系统&#xff0c;以及他们没有试图以某种方式滥用系统&#xff0c;这是非常重要的。 在本章中&#xff0c;我们将介绍几种策略来实现这一目标。 我们将学习…

【yolo系列:YOLOV7改进-添加EIOU,SIOU,AlphaIOU,FocalEIOU.】

yolo系列文章目录 在YoloV7中添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU. 2023-2-7 更新 yolov7添加Wise-IoUB站链接 重磅&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; YOLO系列模型改进损失函数 文章目录 yolo系列文章目录一、初始的yolov7损失函数二、首…

7346-2015 控制电机基本外形结构型式

声明 本文是学习GB-T 7346-2015 控制电机基本外形结构型式.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了控制电机的机座号、外形及安装尺寸、轴伸型式、出线方式、标记及铭牌。 本标准适用于各类控制电机(以下简称电机),其…

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#xff0…

数据结构面试常问问题--保研及考研复试

前言&#xff1a; Hello大家好&#xff0c;我是Dream。今年保研上岸山东大学人工智能专业 &#xff08;经验贴&#xff09;&#xff0c;现在将我自己的专业课备考知识点整理出来&#xff0c;分享给大家&#xff0c;希望可以帮助到大家&#xff01;这是重点知识总结&#xff0c;…

为什么短视频离不开美颜SDK?短视频领域的秘密武器

在当今的社交媒体时代&#xff0c;短视频已经成为了人们获取信息、娱乐和社交的重要方式。无论是抖音、快手&#xff0c;还是Instagram、TikTok&#xff0c;短视频都以其独特的魅力吸引着数亿用户。而在这些短视频的背后&#xff0c;有一款名为“美摄美颜SDK”的秘密武器&#…

软件项目验收测试报告-软件项目验收流程

对甲方而言&#xff0c;项目验收是正式接受项目成果&#xff0c;将项目从建设转为运营。对于乙方来说&#xff0c;则意味着项目的结束&#xff0c;项目资源的释放。 项目验收是项目收尾的重要环节&#xff0c;依据招投标文件、合同对测评相关要求内容、项目章程和项目过程中的…

国庆出游远程实测:ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性

ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性 【前言】【实测软件】【测试环境】【实操体验】1. 软件安装2. 登录速度3. 文件传输4. 操作延迟5. 画面清晰度6. 安全防护 【本文小结】 【前言】 随着科技的不断发展&#xff0c;远程控制软件已成为我们生活中不可或缺的一部分…

7344-2015 交流伺服电动机通用技术条件

声明 本文是学习GB-T 7344-2015 交流伺服电动机通用技术条件.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了交流伺服电动机的分类、技术要求和试验方法、检验规则、交付准备。 本标准适用于两相交流伺服电动机(以下简称电机…

7321-2017 定形耐火制品试样制备方法

声明 本文是学习GB-T 7321-2017 定形耐火制品试样制备方法.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了定形耐火制品制样的定义、制样部位的确定原则和试样的制备。 本标准适用于定形耐火制品试样的制备。 2 规范性引用文…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

[补题记录] Atcoder Beginner Contest 297(F)

URL&#xff1a;https://atcoder.jp/contests/abc297 目录 F Problem/题意 Thought/思路 Code/代码 F Problem/题意 给一个 H * W 的矩形&#xff0c;在其中任意放置 K 个点&#xff0c;由这 K 个点构成的最小矩形带来的贡献为该矩形的面积&#xff0c;这 K 个点构成一种…

1.6 IntelliJ IDEA开发工具

前言&#xff1a; ### 1.6 IntelliJ IDEA开发工具笔记 - **背景**&#xff1a; - 使用基础文本编辑器如记事本编写Java代码虽然可行&#xff0c;但存在效率低下且难以调试的问题。 - 集成开发环境 (IDE) 可以有效地提高Java程序的开发效率。 - **常见Java IDE**&#xf…

光伏发电预测(GRU模型,Python代码)

运行效果&#xff1a;光伏发电预测&#xff08;GRU模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 所有库的版本&#xff1a; 1.数据集&#xff08;连续10年不间断采集三个光伏电站的发电量及天气情况&#xff0c;每隔半个小时采集一次信息&#xff0c;因此&…

NICE-SLAM——论文简析

NICE-SLAM: Neural Implicit Scalable Encoding 现有的神经隐式表征方法会产生过度平滑的场景重建&#xff0c;并且难以扩展到大型场景。这些局限性主要是由于其简单的全连接网络架构没有将局部信息纳入观测。NICE-SLAM通过引入分层场景表示法&#xff0c;纳入了多层次的局部信…

【Kotlin精简】第2章 集合

1 简介 在 Kotlin 中集合主要分为可变集合与只读集合&#xff0c;其中可变集合使用 “Mutable” 前缀 集合类名表示&#xff0c;比如 MutableList、MutableSet、MutableMap 等。而对于只读集合就是和 Java 中集合类名是一致。 Java 中的 List 非 Kotlin 中的 List , 因为 Kot…

GPT系列论文解读:GPT-3

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

ChatGPT Vision初体验

本周&#xff0c;OpenAI为其广受欢迎的 ChatGPT 平台发布了一项突破性的补充。除了处理文本之外&#xff0c;ChatGPT 现在还可以处理图像并聊天。 很难夸大这件事的重要性。目前多达70% 的内容是视觉内容而不是书面内容。人们每年会生成数千张照片&#xff0c;而当今许多最大的…

VR模拟鸡胚培养接种实验,打造沉浸式的学习环境

在医学教育领域&#xff0c;传统的鸡胚接种实验一直是教学的重要组成部分。然而&#xff0c;这种实验方法存在一定的局限性&#xff0c;如操作难度大、成本高、安全隐患等。为了解决这些问题&#xff0c;越来越多的教育机构开始尝试引入虚拟现实(VR)技术&#xff0c;以模拟鸡胚…