【JavaSE】第六节.数组

前言

【本节目标】

一、数组的基本概念

1.1为什么要使用数组

1.2什么是数组

1.3 数组的创建及初始化

1.3.1 数组的定义

1.3.2数组的多种定义方式

1.4 数组的使用

1.4.1 数组中元素访问

1.4.2数组遍历

二、数组是引用类型

2.1 初始JVM的内存分布

2.2认识null

2.3分析引用变量

2.4有关问题

三、数组的应用场景

3.1 保存数据

3.2作为函数的参数

3.3作为函数的返回值

四、二维数组   

总结




前言

今天我们进入到Java中有关数组的学习,数组在c语言中已经有学到,今天我们就来简单了解一下数组在Java中是如何进行操作的,让我们一起来认识一下Java中的数组吧!!!!!!


【本节目标】

1. 理解数组基本概念
2. 掌握数组的基本用法
3. 数组与方法互操作
4. 熟练掌握数组相关的常见问题和代码

一、数组的基本概念

1.1为什么要使用数组

为了能够满足 可以存储多种相同类型的变量,于是 便规定了一种新的数据类型:数组。

假如说,我们有这样的一个需求,需要存储10个整型变量的值;

       那么,按照以前的所学知识,我们会定义10个变量;但是,定义10个变量 的数量有一点点多,而且 它们全部都是整型变量。所以我们用数组来解决这一问题;

1.2什么是数组

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

注意:

  1. 数组中存放的元素其类型相同;

  2. 数组的空间是连在一起的 ;

  3. 每个空间有自己的编号,即数组的下标(从0开始编号,我们可以运用下标 来对数组中的元素进行访问和修改)。

1.3 数组的创建及初始化

1.3.1 数组的定义

int[] array

在Java中,int [ ] 是数组的 数据类型,那么我们可以这样来定义数组

  int [ ] array —> int [ ] 是数据类型,array是 变量。

1.3.2数组的多种定义方式

第一种方式:

int[] array1 = {1,2,3,4,5,6,7,8,9,10}; 

第二种方式:

int[] array2 = new int[] {1,2,3,4,5,6,7,8,9,10};

注意:

1.在前两种定义和初始化的过程中,括号[ ]当中 不能有任何的数字,否则就会报错;

2.我们可以通过 数组名.length自动获取当前数组的长度:

第三种方式:

int[] array3 = new int[10];

ps: 

这一种方式的主要区别与前面两种的是:没有初始化。

说明:

1.三种定义方式 可以根据自己的需求,来决定到底用哪一种。但是,平常我们用的最多的是第一种方式

                                                                                                                                                  

2.第一种方式 和 第二种方式 中括号[ ] 里面 是肯定不可以有数字的,至于第三种定义方式,肯定是要有数字的,否则它肯定推不了数组的长度(后面都没有赋值)。

 注意:

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

并且根据数组中储存元素的类型的不同,导致其默认值不同;

                                                                                                                                                                                                                                                                                                    

常见类型对应的默认值:

数组越界问题:


1.4 数组的使用

1.4.1 数组中元素访问

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

 当然, 访问数组下标的时候,千万不能越界:

 1.4.2数组遍历

定义:" 遍历 是指将数组中的所有元素都访问一遍;

           访问是指对数组中的元素进行某种操作(比如说:打印)。

访问方式:

第一种打印方式(for 循环):

第二种打印方式(for-each):(增强for循环)

  普通的for循环和增强for循环的区别:

 普通for循环 可以拿到数组的下标,通过下标对数组进行操作;

增强for循环 我们只是拿到了变量的值,与下标无关。

第三种打印方式(借用Java本身提供的一些方法来实现数组的打印):

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

                                                                                                                                                  

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

二、数组是引用类型

2.1 初始JVM的内存分布

划分内存的好处是:简洁、方便管理。就比如是这样: 

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

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

举例说明:

public class TestDemo {
    public static void main(String[] args) {
        int a = 10;//a是局部变量,我们把它放到了Java虚拟机栈 当中
    }
}

图示分析:

定义数组内存分配的情况:

    public static void main(String[] args) {
        
        int[] array = {1,2,3};
        System.out.println(array);
    }


 【注意】引用是一个变量,里面存的是地址。


2.2认识null

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

代码分析:

 

2.3分析引用变量

分析一:

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

画图示例分析:

 说明这两个引用array1,array2指向同一个对象;

 结论:对于array1=array2;

不要说array2引用指向了引用,而是说 这个引用array2 指向了 array1所指向的对象。


 分析二:

 2.4有关问题

问题一:引用能指向引用吗?

答案不能这句说法就是有问题的(引用只能指向对象,引用不能指向引用)。

int[] array1 = array2 代表:array1这个引用 引用了array2所引用的对象。 

问题二:一个引用可以同时指向多个对象吗?

答案:不能可以不同时指向多个对象,但只能同时指向一个对象

(指向另外一个对象的时候,上一次所存储的对象的地址被销毁掉)。

eg:

问题三:引用一定是在栈上吗?

答案:不是的,现在之所以把它画在栈上,是因为我们目前只接触到了 局部变量,还没有接触到成员变量;这个成员变量在后面会继续介绍的。 

问题四:引用赋值null代表啥?

答案:int[ ] array = null 代表整个引用不指向任何对象。 

三、数组的应用场景

3.1 保存数据

 

3.2作为函数的参数

1. 参数传基本数据类型

一步一步的来分析:

首先,在栈上分配了一块内存空间存储 x=10;

       然后,进入func1方法,在栈上又开辟了一块int[ ] 类型的内存,把10赋给a;

       接着,又把20赋值给了a;

       当最终func1方法结束以后,x的值仍然还是10,并没有发生改变;所以打印的还是10,并没有打印20。

原因:

因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。  


2. 参数传数组类型(引用数据类型)

原因:

因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。  

总结: 所谓的 "引用" 本质上只是存了一个地址. Java 数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只 是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝。

3.3作为函数的返回值

 定义:

C语言里面是不能返回数组的;但是Java里面可以返回数组,不过返回的都是地址。


四、二维数组   

定义:

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。 

语法格式:

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

二维数组定义及初始化:

第一种(以直接赋值的方式):

 int[][] array1 = {{1,2,3},{4,5,6}};

第二种(直接new):

int[][] array2 = new int[][] {{1,2,3},{4,5,6}};

注意:

 前面两种方式(后面有自己 赋初值的) 都不能在 中括号里面 写数字,否则就会报错;它会自动识别并给出相应的数据。

第三种(没有赋初始值的):

 int[][] array3 = new int[2][3];

ps:

此时左端行数值可以省略,右端列必须有数值(不然判断不出来有几行几列),并且默认初始值都是0。

代码举例打印二维数组:

可是,难道需要每一次都去改变 i 和 j 的值来改变 行和列的嘛,这明显不现实;

       因此咱们还需要修改一下:

 图示分析:

总结

今天我们学习了Java中有关数组的内容,本节中数组内容和c语言中还是有所区别,数组在Java中是非常重要知识点,希望大家能够认真理解其含义和用法,能够借此实现一些基本的功能。希望能得到各位的支持,三连必回访!!!!

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值