【JavaSE篇】——数组的定义与使用

news2024/9/27 2:52:40

目录

本章的目标: 

🎈数组的基本概念

🍭创建数组

🍭数组的初始化

🍭数组的使用

👉数组中元素访问

👉遍历数组

🎈数组是引用类型

🍭初始JVM的内存分布

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

👉基本数据类型变量

👉引用数据类型变量

🚩再谈引用变量

🍭认识null

🎈数组的应用场景

🍭保存数据

🍭作为函数的参数

🍭作为函数的返回值


本章的目标: 


🎈数组的基本概念

什么是数组 :可以看成是 相同类型元素的一个集合 。在内存中是一段连续的空间。 java 中,包含n个整形类型元素的数组。
  • 1. 数组中存放的元素其类型相同
  • 2. 数组的空间是连在一起
  • 3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标

🍭创建数组

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

T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度
 public static void main(String[] args) {
        int[] array1=new int[5];  //创建一个可以容纳5个int类型元素的数组
        double[] array2=new double[5];// 创建一个可以容纳5个double类型元素的数组
        float[] array3=new float[5];// 创建一个可以容纳5个float类型元素的数组
    }

我们可以对比c语言的创建数组,int arr[N]={0,1,2};

java创建数组是 int[] arr=new int[N];

其实我们更可以看到java 更能理解,因为arr是数组名,它是Int[]类型是数组arr的类型,而c语言中arr是数组名,int是数组里面的值的类型,并不是数组的类型,数组的类型是int[]。

该种定义方式不太友好,容易造成数组的类型就是 int 的误解
[] 如果在类型之后,就表示数组类型,因此 int[] 结合在一块写意思更清晰。

🍭数组的初始化

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

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

语法格式: 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[] array3 = new String[]{"hell", "Java", "!!!"};//静态
动态初始化:在创建数组时,直接指定数组中元素的个数
int [] array = new int [ 10 ];
int[] array1 = new int[10];//动态
double[] array2 = new double[10];//动态
String[] array3 = new String[10];//动态


【注意事项】
  • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  • 注意:在数组中可以通过 数组对象.length 来获取数组的长度

  • 静态初始化时, {}中数据类型必须与[]前数据类型一致。
  • 静态初始化可以简写,省去后面的new T[]。

int[] array={1,2,3,4};//静态初始化可以省略new T[];

  • 静态和动态初始化也可以分为两步,但是省略格式不可以
int[] array;
array=new int[10];//静态初始化的拆分
int[] array1;
array1=new int[]{1,2,3,4};//动态初始化的拆分

这里就不能省略new.

  •  如果没有对数组进行初始化,数组中元素有其默认值

  • 如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值

  • 如果数组中存储元素类型为引用类型,默认值为null

在一般实际的做题目中,我们用到的最多的是int[] arr=new int[N],因为这样会给默认值,然后开辟了N个长度的数组,然后我们依次赋值。


🍭数组的使用

👉数组中元素访问

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

【注意事项】
1.数组是一段连续的内存空间,因此 支持随机访问,即通过下标访问快速访问数组中任意位置的元素
2. 下标从 0 开始,介于 [0, N )之间不包含 N N 为元素个数,不能越界,否则会报出下标越界异常。

所以访问数组的下标不能到array[array.length],不能取到长度。


👉遍历数组

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

  • for-i遍历数组

  • 使用 for-each 遍历数组

俩者的不同之处是

  • for-i 可以访问到下标,如果对数组中的第二位置的值+1,那么就可以用for-i,则不可以使用for-each。
  • for-each不可以访问到下标,不需要取到特定的值即可用。
  • 借用Java本身提供的一些方法来实现数组的打印

这里首先需要介绍一个 工具类(可以理解为C语言里面的头文件):Arrays

       其主要作用是:帮助对数组进行一个操作(详情可查找帮助手册)

我们可以再成长手册或者这里可以看到有很多类型的数组,这里就表示重载,后面我会详细说。现在可以理解为哪种数组类型就调用哪个哪个。这里是int类型那么我们就toString(int[] a).

这里用数组转换成字符串形式,我们可以看到加了[],为啥会加[]我们可以再toString中ctrl+鼠标左键,进入源码中查看

现在我们并不能完整的看懂这段底层实现的代码,我们可以根据现象直接实现,[1,2,3]这种形式,我们自己实现一下。

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

🎈数组是引用类型

🍭初始JVM的内存分布

而现在我们只简单关心堆 和 虚拟机栈这两块空间,后序JVM中还会更详细介绍。

  • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含 有:局部变量表操作数栈动态链接返回地址以及其他的一些信息,保存的都是与方法执行时相关的一 些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了
  • (Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销

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

  • 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
  • 引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址

👉基本数据类型变量


👉引用数据类型变量

我们大标题是数组是引用数据类型 ,我们就根据数据来阐述。

我们可以通过ox77的地址找到对象。这里的array是变量(引用变量,存储的是对象的地址),引用(指向)一个数组对象。这个数组对象在堆区,我们需要存储这个对象的地址,所以array这个变量存储了,叫做引用变量。

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


🚩再谈引用变量

我们现在给引用变量修改值或者一个数组给另一个数组是如何运行的。

场景1

这个底层是如何实现的呢?

array引用变量存储的是数组对象的首元素的地址,都初始化成默认值0,然后我们对下标为0和下标为1的位置对应的值进行改变,还是对堆上的空间进行改变,array并没有新开一个空间。所以最终array前后打印的值是不一样的。


场景2


这个场景可能有些迷了,array1和array2该输出什么呢?我们一步一步的分析。

场景3

由于array1的空间给了array2,那么对array1的改变,array2也改变了。


场景四

🍭认识null

null 在 Java 中表示 "空引用" , 即:一个不指向对象的引用。

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

🎈数组的应用场景

🍭保存数据

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

🍭作为函数的参数

我们调用func1,首先a引用变量存放ox13的地址,再调用这个函数是arr也指向a的空间,然后arr开辟一个空间,地址是0x99,然后arr指向了地址为0x99的空间,但是a指向的空间并没有改变。所以打印的结果还是1,2,3,4。


调用func2呢?

a引用变量存的是0x13的地址,指向了一块空间,调用func2,也指向了这块空间,然后arr对0位置进行改变,就是相当于对这片空间的下标为0的位置改变。

发现在 func 方法内部修改数组的内容 , 方法外部的数组内容也发生改变 .
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。
上面俩种调用
  •    第一种修改了自己的指向(因为自己开了一块空间),自己是形参,所以对自己的修改并不会影响实参的修改。
  •    第二种修改指向的对象里的值,所以改变指向的对象里面的值,就会改变实参的值

这下面很明显是修改指向的对象里的值,自己没有开空间,所以改变了实参的值。


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

🍭作为函数的返回值


今天张老师很讨厌!

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

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

相关文章

HarmonyOS自定义弹出对话框CustomDialog并传递变量

HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比&#xff0c;还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求&#xff0c;可以基于CustomDialog自定义出各种个性化的反馈组件。 首…

数据库:根据学校的业务规则画出E-R图以及数据库模型图,并构建一个简单的数据库

目录 序言 一、需求 二、E-R图 E-R图&#xff1a; 三、关系模式 数据库模型图&#xff1a; 四、在MYSQL中创建数据库 4.1 年级表的创建 4.2 科目表的创建 4.3 学生表的创建 4.4 成绩表的创建 结果如下&#xff1a; 序言 本篇文章我将通过一个具体的例子教会大家大家…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

vivado 定义和配置I/O端口、

定义和配置I/O端口 您可以使用Vivado IDE导入、创建和配置I/O端口&#xff0c;如中所述以下部分。 导入I/O端口 根据项目类型&#xff0c;可以使用以下方法导入I/O端口&#xff1a; •I/O规划项目&#xff1a;您可以将XDC和CSV文件导入空的I/O规划项目当您使用文件导入功能…

Jmeter实现造10个账户、单元数据

今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。Jmeter实现造10个账户、单元数据,之后大数据量批量造数据以此类推。 1.下载jmeter软件 2.安装jmeter软件 3.运行\bin\jmeter.bat批处理文件 4.选择脚本文件 5.…

全局视角,搞懂“新零售支付”

文章首发于微信公众号:PenguinPay &#xff0c;欢迎关注。 零售业就是商家将商品或服务在场所中卖给消费者。其中的关键词就是 人&#xff0c;货&#xff0c;场。 一、 初始新零售 1.1 传统零售货找人 传统零售业,只能在固定场所销售商品或服务&#xff0c;以商家店为中心只…

缓存技术—redis

一、redis介绍 1.什么是NoSQL NosQL (Not-Only:sQL)&#xff0c;泛指非关系型的数据库(关系型数据库: 以二维表形式存储数据) 非关系型的数据库现在成了一个极其热门的新领域&#xff0c;发展非常迅速。而传统的关系数据库在应付超大规模和高并发的网站已经显得力不从…

pip安装镜像源设置

01.官方镜像源&#xff1a;资料最新&#xff0c;包最全 https://pypi.python.org/simple 02.国内镜像源&#xff1a;国内访问速度快 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 03. 配置方式1&#xff1a;永久替换 pi…

Spark运行架构以及容错机制

Spark运行架构以及容错机制 1. Spark的角色区分1.1 Driver1.2 Excuter 2. Spark-Cluster模式的任务提交流程2.1 Spark On Yarn的任务提交流程2.1.1 yarn相关概念2.1.2 任务提交流程 2.2 Spark On K8S的任务提交流程2.2.1 k8s相关概念2.2.2 任务提交流程 3. Spark-Cluster模式的…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

《WebKit 技术内幕》学习之十五(5):Web前端的未来

5 Crosswalk项目 Crosswalk项目是由英特尔公司发起的一个开源项目&#xff0c;该项目基于WebKit&#xff08;Blink&#xff09;和Chromium等开源项目打造&#xff0c;其目的是提供一个跨不同操作系统的Web运行环境&#xff0c;包括Android、Tizen、Linux、Windows、MacOS等众多…

Linux-----Shell编程之循环语句

目录 一、小命令 1、echo 实验&#xff1a; 2、date ------ 查看当前系统时间 3、cal ---- 日历 4、seq 打印 二、循环语句 1、for语句 实验&#xff1a; 计算整数和&#xff1a; 列出奇偶数 批量添加、删除用户 密码验证 随机抽奖 改名 九九乘法表 九九乘…

线性表--栈

1.什么是栈&#xff1f; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff…

AI大模型开发架构设计(5)——人人能学会的Llama-2大模型微调

文章目录 人人能学会的Llama-2大模型微调1 什么是Llama-2以及关键特性分析什么是Llama-2?Llama-2关键特性分析2 Llama-2微调全流程剖析为什么要微调Llama-2?Llama-2微调全流程3 基于Llama-2微调3个应用案例案例1:电子游戏评价数据生成文本数据集合案例2:利用Llama-2微调模型…

linux 查看zookeeper server运行版本号

zookeeper版本查看运行命令&#xff1a;echo stat|nc localhost 2181 显示如下图所示&#xff1a; Zookeeper version: 3.4.5-cdh6.3.2--1, built on 11/08/2019 13:15 GMT Clients: /127.0.0.1:44814[0](queued0,recved1,sent0) Latency min/avg/max: 0/0/0 Received: 9 Se…

【Linux】开始使用 vim 吧!!!

Linux 1 what is vim &#xff1f;2 vim基本概念3 vim的基本操作 &#xff01;3.1 vim的快捷方式3.1.1 复制与粘贴3.1.2 撤销与剪切3.1.3 字符操作 3.2 vim的光标操作3.3 vim的文件操作 总结Thanks♪(&#xff65;ω&#xff65;)&#xff89;感谢阅读下一篇文章见&#xff01;…

这是一片测试文章

这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 这是一片测试文章 真的是测试文章 -111122225555444433333333222211111 dddddaaa

网络安全B模块(笔记详解)- HASH算法的基本使用

1.通过服务器场景(A-Server),进行HASH算法的基本使用。将123456作为openssl md5 的输入参数,使用 123456进行md5计算并将内容输出到屏幕。将此命令中输出结果的命令作为Flag提交; 2.通过服务器场景使用不同的加密方式对123456进行加密,对比两个加密字符串有何不同。使用…

20240127如何在线识别德语字幕?

20240127如何在线识别德语字幕&#xff1f; 2024/1/27 11:42 1945[科尔贝格]Kolberg 01:48:49 接近109分钟 德语视频的字幕OCR适配&#xff1a; 1、whisper&#xff0c;8:39-8:58&#xff0c;使用GTX1080需要接近20分钟。对整机性能要求比较重&#xff0c;特别吃显卡&#xff…

代码随想录算法刷题训练营day16

代码随想录算法刷题训练营day16&#xff1a;LeetCode(104)二叉树的最大深度 、LeetCode(559)n叉树的最大深度、LeetCode(111)二叉树的最小深度、LeetCode(222)完全二叉树的节点个数 LeetCode(104)二叉树的最大深度 题目 代码 /*** Definition for a binary tree node.* publ…