Java:数组的定义与使用

 

目录

数组的基本概念

初步了解数组

数组的初始化

数组的使用

打印数组

数组是引用类型

初始JVM的内存分布

基本数据类型与引用数据类型的区别

引用变量的两道经典例题

null

补充

二维数组


数组的基本概念

初步了解数组

与C语言一样,在Java中,数组也是可以看成是相同类型元素的一个集合,在内存中是一段连续的空间。在Java中同样需要注意以下的几个点:

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

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

3. 每个空间都有自己的下标,起始位置的下标为0。

数组的初始化

在Java中,数组的初始化主要可以分为三种:动态初始化静态初始化直接初始化

1. 动态初始化:在创建数组的时候,直接指定数组中元素的个数,例如下面这样:

int[] array=new int[10];

这样初始化后数组中存的元素的值都是0

2. 静态初始化:在创建数组的时候,不直接指定数组元素的个数,而是直接将具体的数据内容进行指定,例如下面这样:

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

3. 直接初始化:在创建数组的时候,直接将具体的数据内容进行指定,其本质上就是静态初始化(可以看作是静态初始化的简写),例如下面这样:

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

对于数组的初始化有下面几点需要注意:

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

2. 静态初始化的时候,{ }中的元素类型必须是和[ ]前指定的数据类型一致

3. 一般在使用数组的时候,建议使用静态初始化来对数组进行初始化,但是如果是不确定数组中要存入的内容的时候,则可以选择使用动态初始化

4. 静态和动态初始化可以分成两步来写(就像下面这样),但是直接初始化是不行的

int[] array1;
array1=new int[10];

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

5. 动态初始化的时候如果是布尔类型则会将数组中所有元素赋为false

6. 如果数组中存储元素类型是引用类型,则默认值为null

数组的使用

与C语言一样,Java的数组在内存中是一段连续的空间,空间的编号都是从0开始,介于[0,N)之间(否则会报出越界访问的警告),依次递增该编号称为数组的下标,所以数组支持随机访问,即通过下标访问数组任意位置的元素。

打印数组

在Java中,打印数组可以分为两大种方法:遍历数组数组转字符串

所谓“遍历”,就是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作。在Java中,有两种遍历的操作方法(如下):

1. 遍历数组

(1)在数组中通过 数组对象.length 来获取数组的长度来进行循环打印,例如:

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

(2)使用 for each 来遍历数组,例如:

for(int x : array){
    Systom.out.println(x);
}

上面这两种遍历数组的方法的区别是:for each遍历数组这种方法只能对数组中的元素进行逐一获取,而第一种方法则可以对数组中元素进行获取并修改等。

2. 数组转字符串

在Java中,也可以使用数组转字符串来对数组进行打印,具体是使用 Arrays.toString 来实现,例如:

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

当然要注意的是,在使用Arrays.toString的时候,需要在代码最前面写上“import java.util.Arrays;”这段代码。

数组是引用类型

初始JVM的内存分布

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

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

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

3. 程序中的常量也要保存

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

对此,JVM就对所使用的内存按照功能的不同进行了划分(如图):

1. 程序计数器:只是一个很小的空间,保存下一条执行指令的地址

2. Java虚拟机栈:存放的是一些局部变量

3. 本地方法栈:运行一些由C/C++代码编写的程序(JVM其实是一个软件,是一个由C/C++代码编写的软件)

4. 堆:JVM所管理的最大内存区域,使用new创建的对象都是在堆上保存的。堆是随着程序开始运行而创建,随程序的退出而销毁,堆中数据只要还有在使用,就不会被销毁(在Java中,与C语言不同的是,在堆上开辟的内存不再需要自己手动free,因为JVM本身会有垃圾回收器来帮助回收内存

5. 方法区:存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

有一点需要注意:方法区和堆是由所有线程共享的数据区;Java虚拟机栈、本地方法区、程序计数器为线程隔离的数据区(也就是所有线程中都包含这些),画成图像为:

基本数据类型与引用数据类型的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;

引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

下面用一段代码来举例:

    public static void main(String[] args) {
        int a=10;
        int b=20;
        int[] array=new int[]{1,2,3};
    }

在上面这段代码中,a、b、array都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值;array是数组类型的引用变量,其内部保存的内容可以简单理解成数组在堆空间中的首地址(也就是说,引用变量并不直接存储对象本身,而是通过该地址,引用变量就可以去操作对象(类似于C语言的指针)) 

引用变量的两道经典例题

第一题:

public class TestDemo {
    public static void fuc(int[] array){
        array[0]=2;
    }

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

第二题:

public class TestDemo {
    public static void fuc(int[] array){
        array=new int[]{4,5,6};
    }
    
    public static void main(String[] args) {
        int[] array=new int[]{1,2,3};
        fuc(array);
        System.out.println(Arrays.toString(array));
    }
}

对于第一道题来说,很自然地就想到是引用类型,在fuc函数中对数组进行修改是会发生变化的,如图:

而对于第二道题来说,在fuc函数中对数组进行修改是不会发生变化的,如图:

从上面这两个图就可以很直观地看出图一中形参是会对引用的对象内容进行修改,而图二则是重新指向另外一个对象,实参地址引用的对象是不会改变的,所以打印出来的数组和原来是一样的。

null

在Java中,null表示的是“空引用”,相当于是一个不指向对象的引用。 

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

还有一点要注意:Java中并没有约定null和0号地址的内存有任何关联。

补充

下面补充使用引用时常见的4个问题:

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

答:不能,引用只能指向对象。

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

答:不能,引用只能同时指向一个对象。

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

答:不一定,有可能世在堆上。

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

答:代表整个引用不指向任何对象。

二维数组

二维数组本质也是一维数组,只不过每个元素又是一个一维数组。(也可以这么说:一维数组是一个特殊的二维数组)

其实归根到底,二维数组就是一个存放各一维数组地址的一个数组,而每一个一维数组就是二维数组中每一行的首元素地址。

在C语言中我们知道,创建一个二维数组可以不指定行数,但一定是要指定其列数的,不然会报错;而Java则不同,在Java中,创建一个二维数组可以不指定列数,但是一定要指定行数

所以在Java中,二维数组中每一行有多少个元素有时候我们是不能够确定的,这时候我们会称之为不规则数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值