JavaSE语法之五:数组的定义与使用(超详解!!!)

文章目录

    • 一、数组的概念
      • 1. 什么是数组
      • 2. 数组的创建及初始化
      • 3. 数组的使用
        • 3.1 数组中元素的访问
        • 3.2 遍历数组
    • 二、数组是引用类型
      • 1. 初始JVM的内存分布
      • 2. 基本类型变量与引用变量的区别
      • 3. 引用变量
      • 4. 认识null
    • 三、数组的应用场景
      • 1. 保存数据
      • 2. 作为函数的参数
        • 2.1 参数传基本类型
        • 2.2 参数传数组类型(引用数据类型)
      • 3. 作为函数的返回值
    • 四、二维数组

一、数组的概念

假设存5个学生的考试成绩,并进行输出,我们用之前掌握的知识点来写:

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个、100个同学的成绩呢?不仅非常麻烦,代码也非常冗余,我们仔细观察可以发现:所有成绩的类型都是相同的, 那就引出我们的数组。

1. 什么是数组

数组是用来存储一组相同类型的数据的,在内存中是一段连续的空间。

数组的存储:

在这里插入图片描述1. 1. 数组中存放的元素其类型相同 ;
2. 数组的空间是连在一起的;
3. 每个空间有自己的编号,起始位置的编号为0,即数组的下标/索引。

2. 数组的创建及初始化

【数组的创建】

//方式一:定义数组,同时进行初始化(用的最多!!!)
int[] array = {1,2,3,4,5,6};

//方式二:定义数组,new开辟内存同时进行初始化。
int[] array = new int[]{1,2,3,4,5,6,};

//方式三:只是分配了内存,没有进行初始化。大小是10,内容是0
int[] array = new int[10];
int[] array = new int[]{1,2,3,4,5,6,};

注意:

  • 一般通过 new关键字 实例化对象;
  • Java当中的数组,其实就是一个对象,所以Java中:一些皆对象;
  • 在new的时候会生成一块内存,放12345,里面的编号是多少。

【数组的初始化】

  1. 动态初始化: 在创建数组时,直接指定数组中元素的个数。
int[] array = new int[10];
  1. 静态初始化: 在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定。
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;
array = new int[]{1,2,3,4};

//不可以这样写,会报错
int[] array;
array = {1,2,3,4};

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

  • 如果数组中储存元素为基类类型,默认值为基类类型对应的默认值,如:
    在这里插入图片描述

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

3. 数组的使用

3.1 数组中元素的访问
	int[] array = {1,2,3,4,5};
	array[0] = 99; //修改第一个值
  System.out.println(array[0]); //99
  System.out.println(array[6]); //越界或负数,都会报数组越界异常ArrayIndexOutOfBoundsException
  System.out.println(array.length); //5 数组的长度

【注意事项】

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素;
  2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
3.2 遍历数组
  1. 可以一个一个的输出进行遍历
  2. 也可以用for循环
    【方法1 】
    【代码】
	int[] array = {1,2,3,4,5,6};
//方法1:通过下标来访问
	for (int i = 0; i < array.length; i++) {
		System.out.println(array[i]);
}

【输出结果】
在这里插入图片描述
【方法2】
【代码】

//方法2:for-each:和下标没关系,数组中每个元素的类型的变量
	for (int x : array) {
		System.out.println(x);
}

【输出结果】
在这里插入图片描述
【方法3】
Java中有个类Arrays,是专门操作数组的。
【代码】

//方法3:用定义好的类
	String ret = Arrays.toString(array); //有String返回值,所以要接收一下,就在=左边定义String
	System.out.println(ret);

【输出结果】
在这里插入图片描述

其中:
在所有遍历方法的前面加上Arrays.sort(array);即可对数组里面的值进行排序.

二、数组是引用类型

1. 初始JVM的内存分布

程序最终都是保存在JVM里的,内存是一段连续的存储空间,用来存储程序运行时数据的.比如:

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

其中,JVM 也对使用的内存按照功能的不同进行了划分:
在这里插入图片描述
其中:

  1. Java虚拟机栈(JVM Stack) :就是我们平常所说的栈.与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的写一些信息.比如:局部变量.当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了.
  2. 堆: JVM所管理的最大内存区域,使用 new 创建的对象都是在对上保存,堆是对着程序开始而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁.
  3. 方法区: 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据.方法编译出的字节码就是保存在这个区域.
  4. 本地方法栈: 本地方法栈与虚拟机栈的作用类似,之不报保存的内容是Native方法的局部变量.有些版本的JVM实现中(例如HotSpot),本地方法栈和虚拟机栈是一起的.
  5. 程序计数器:只是一个很小的空间,保存下一条执行的指令地址.

关于数组为什么是引用类型变量?
为什么说数组array是引用类型的变量,因为他存了数组的地址

int[] array = {1,2,3};

在这里插入图片描述

  1. 首先,有两块内存,一个是栈(Java虚拟机栈),一个是堆;
  2. 只要是new什么,就是在堆里开辟内存,并且在堆里面开辟了一块内存,存储数组中new出来的内容(1,2,3);
  3. array是局部变量,局部变量的内存在栈上,其中array存的是变量的地址0x111,我们把存了地址的变量叫做引用变量 .

【代码】

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

【运行结果】
在这里插入图片描述
其中:
① " I " 代表是一个整型数组;
② " @ " 符号作为分割;
③ 后面是一个16进制的数字,这个数字暂且代表地址.

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

基本数据类型变量:又称为基本变量,该变量空间中直接存放的是其所对应的值;
**引用数据类型变量:**一般称为对象的引用,其空间中存储的是对象所在空间的地址。
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。 有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。

3. 引用变量

  1. int[] array2 = array1; 代表array2这个引用指向了array1这个引用所指向的对象!
  2. 两个引用同时指向了一个对象
  3. 通过其中任何一个引用,修改这个对象的值,另一个引用去访问的时候,也是被改变的

例1:

  	int[] array1 = {1,2,3,4};
        array1[0] = 99;

        int[] array2 = array1;
        array2[0] = 100;

        System.out.println(Arrays.toString(array1)); //100 2 3 4
        System.out.println(Arrays.toString(array2)); //100 2 3 4

如图:
在这里插入图片描述
由此可以看出:
int[] array2 = array1; 代表 array2这个引用 指向了array1这个引用 所指向的对象, array1 和 array2 二者指向一个对象.

例2:

	 public static void main(String[] args) {
        int[] array1 = {1,2,3,4};
        int[] array2 = {11,22,33,44};
        array1 = array2;
        array1[0] = 1888;
        System.out.println(Arrays.toString(array1)); // 1888 22 33 44
        System.out.println(Arrays.toString(array2)); // 1888 22 33 44
    }

在这里插入图片描述
由图可知:
array1 = array2; 代表array1这个引用,指向了array2这个引用所指向的对象。array1之前的对象就没有任何变量用了,被系统回收;
②此时在0x1230中,两个引用同时指向一个对象;
③通过其中任何一个引用,修改0x123对象的值,另一个引用去访问的时候,也是会被改变的。

4. 认识null

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

int[] arr = null; //此时arr这个引用,不指向任何对象
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 号地址有关联。

三、数组的应用场景

1. 保存数据

//存储 1 2 3,并把1 2 3打印出来
int[] array = {1,2,3};

for(int i = 0;i <arr.length; i++){
	System.out.println(array[i] + " ");
 }
 

2. 作为函数的参数

2.1 参数传基本类型

形参的改变,不会影响到实参的值。

	public static void main(String[] args) {
		int num = 0;
		func(num);
		System.out.println("num = " + num);
	}
	public static void func(int x) {
		x = 10;
		System.out.println("x = " + x);
	}

// 执行结果
x = 10
num = 0

执行过程如图:
在这里插入图片描述
我们发现在func方法中修改形参 x 的值, 不影响实参的 num 值

2.2 参数传数组类型(引用数据类型)
 public static void func1(int[] array) {
        array = new int[]{22,33,44};
    }
    public static void func2(int[] array) {
        array[0] = 999;
    }

    public static void main(String[] args) {
        int[] array1 = {1,2,3,4};
        func1(array1);
        System.out.println(Arrays.toString(array1));  //[1, 2, 3, 4]
        
        int[] array2 = {1, 2, 3, 4};
        func2(array2);
        System.out.println(Arrays.toString(array2)); //[999, 2, 3, 4]

    }
}
//执行结果
[1, 2, 3, 4]
[999, 2, 3, 4]

执行过程:
当数组作为参数进行传递的时候,其实还是按值传递,只不过此时的值是一个地址!!那么就会出现两种情况:

关于func1():形参修改指向
在这里插入图片描述
所以此代码,只是改变了形参的指向,并没有改变形参的指向,最后结果打印的是实参。

关于func2():形参修改指向对象的值
在这里插入图片描述
此时,传递的是引用,我们通过引用修改了原来的值。

3. 作为函数的返回值

如:将数组的每个元素都扩大2倍。
方法:调用grow()方法,会给grow方法开辟一块内存

 //将数组的每个元素都扩大2倍!
    public static int[] grow(int[] array) {
    //遍历数组中的每个元素
        for (int i = 0; i < array.length; i++) {
            array[i] = array[i]*2;
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = {1,2,3,5,9};
        int[] ret = grow(array);
        System.out.println(Arrays.toString(array)); //[2, 4, 6, 10, 18]
        System.out.println(Arrays.toString(ret));  //[2, 4, 6, 10, 18]
    } 

相当于在同一个对象上进行了修改。

四、二维数组

二维数组本质上也就是一堆数组,只不过每个元素 又是一个一维数组。
可以理解是两行。

【格式】
int[][] array = {{1,2,3} , {4,5,6}}; 两行三列
int[][] array = new int[][]{{1,2,3} , {4,5,6}};
int[][] array = new int[2][3];
不规则的二维数组:int[][] array = new int[2][]; 指定了是两行,没有指定列。

【代码】

//for循环的三组打印方式
public static void main(String[] args) {
	int[][] array = {{1,2,3},{4,5,6}};
  for (int i = 0;i < 2,i++) {
    for (int j = 0;j <3;j++) {
       System.out.println(array[i][j]);
    }
      System.out.println();

 }
  }

二维数组的用法和一维数组并没有明显差别,因此我们不再赘述。
同理, 还存在 “三维数组”,“四维数组” 等更复杂的数组, 只不过出现频率都很低。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年淘宝年终好价节精选红包怎么领取?

2023年淘宝年终好价节精选红包怎么领取? 2023年淘宝双十二改名为了年终好价节&#xff0c;活动力度也提升了&#xff0c;不仅有官方立减和跨店满减&#xff0c;还有精选红包可领。那么&#xff0c;2023年淘宝年终好价节精选红包怎么领取?下面小编就给大家介绍下&#xff0c;赶…

教程篇(7.2) 01. 介绍和初始访问 ❀ FortiAnalyzer分析师 ❀ Fortinet 网络安全专家 NSE5

在本课中&#xff0c;你将了解FortiAnalyzer的关键功能和概念&#xff0c;以及如何最初访问FortiAnalyzer。 FortiAnalyzer将日志记录、分析和报告集成到一个系统中&#xff0c;因此你可以快速识别和响应。 在本课中&#xff0c;你将探索上图显示的主题。 通过展示FortiAnalyze…

种下一棵栀子花

女孩说自己是男孩当年伸手就可触及的栀子花.男孩沉默了,明白了当初失去了什么. 时光倒流,13年前的一个夏天夜晚,男孩与女孩同在沪城,女孩分享了自己的照片给男孩.男孩站在窗前,那晚的夜空很美丽,仿佛托着那个白衣裳女孩的纯真的梦,来到了自己的身边. 女孩说彼此间只是少了一个深…

Linux---日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志管理简介 工作当中的日志&#xff0c;特指硬件和软件的日志&#xff0c;管理员可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。日志管理包括管理系统日志、应…

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…

如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…

java聊天程序(群聊)简单版

先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class QLFWD{public static ServerSocket server_socket;public static ArrayList<S…

LeetCode:1466. 重新规划路线(DFS C++、Java)

目录 1466. 重新规划路线 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1466. 重新规划路线 题目描述&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有…

联想范建平:联想混合AI架构具备两大明显优势

12月7日&#xff0c;首届AI PC创新论坛在北京联想集团总部举办。联想集团副总裁、联想研究院人工智能实验室负责人范建平表示&#xff0c;为提供真正可信、个性化的AI专属服务&#xff0c;联想提出了混合智能&#xff08;Hybrid AI&#xff09;概念&#xff0c;并已经显现出更强…

物联网智能水表如何保证用户隐私和数据安全?

随着科技的发展, 物联网已经渗透到了我们生活的各个领域, 智能水表作为其中的一种应用之一。但是&#xff0c;在使用智能水表时&#xff0c;不可避免地涉及到用户隐私和数据安全的问题。所以&#xff0c;我们应该如何保证智能水表的用户隐私和数据安全呢&#xff1f; 首先&…

Java面向对象(高级)-- 注解(Annotation)

文章目录 一、 注解概述&#xff08;1&#xff09; 什么是注解&#xff08;2&#xff09; 注解与注释&#xff08;3&#xff09; 注解的重要性 二、常见的Annotation作用&#xff08;1&#xff09;示例1&#xff08;2&#xff09;示例2&#xff08;3&#xff09;示例3 三、 三个…

自动化测试:PO模式详解!

PO&#xff08;Page Object&#xff09;模式是一种在自动化测试中常用的设计模式&#xff0c;将页面的每个元素封装成一个对象&#xff0c;通过操作对象来进行页面的交互。 概括来说就是&#xff0c;每个页面都有对应的PO类&#xff0c;PO类中包含了页面的元素定位和操作方法。…

OMSA无法打开无法显示等服务异常时如何处理

文章目录 为何需要重启OMSAWindows 重启OMSA服务Linux 重启OMSA服务VMware 环境重启OMSA服务重启无效的解决办法推荐阅读 为何需要重启OMSA 在安装 OMSA 的服务器中&#xff0c;OMSA 管理软件运行可能会不稳定。例如&#xff1a; 某些信息&#xff08;如存储信息&#xff09;…

使用DockerUI结合内网穿透工具轻松实现公网访问和管理docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

C - 语言->内存函数

目录 系列文章目录 前言 1. memcpy使⽤和模拟实现 1.2 memcpy函数的模拟实现: 2. memmove 使⽤和模拟实现 2.1memmove的模拟实现&#xff1a; 3. memset 函数的使⽤ 4. memcmp 函数的使⽤ 系列文章目录 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff…

我有才打造知识付费小程序

一站式线上线下活动管理 为用户提供“精彩城市生活和人脉资源”。 在线活动提供创业、互联网、科技、投资、金融、教育、亲子、生活、聚会交友、医疗、设计、分享会、脱口秀、音乐演出等多种活动类型, 为职场白领提升技能、拓展人脉、聚会交友的首选平台。 为主办方提供“一…

迅镭激光受邀参加中国船舶与海洋工程产业知识产联盟年会

近日&#xff0c;由中国船舶工业行业协会知识产权分会、中国船舶与海洋工程产业知识产权联盟主办的“知识产权高质量发展高端论坛暨中国船舶工业行业协会知识产权分会及中国船舶与海洋工程产业知识产权联盟年会”在南通举行。 本次会议荟聚中国船舶行业专家、高校、科研院所及船…

基于ssm学生请假系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生请假系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

Java网络编程——创建非阻塞的HTTP服务器

HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超级文本传输协议&#xff09;是网络应用层的协议&#xff0c;建立在TCP/IP基础上。HTTP使用可靠的TCP连接&#xff0c;默认端口是80端口。HTTP的第1个版本是HTTP/0.9&#xff0c;后来发展到了HTTP/1&#xff0c;现在最…

拼多多选品大作战:利用类目榜单找到潜力爆品

想要在激烈的电商竞争中脱颖而出&#xff0c;选品是至关重要的一环。 而拼多多提供的类目榜单数据&#xff0c;为商家们提供了一个寻找热门产品和趋势的利器。本文将详细介绍如何利用拼多多类目榜单进行选品&#xff0c;并帮助您找到畅销产品。 拼多多新手选品核心两要素&…