java数组内存分配内存_Java数组及其内存分配

几乎所有的程序设计语言都支持数组。Java也不例外。当我们需要多个类型相同的变量的时候,就考虑定义一个数组。在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。

1.数组的初始化方式及其内存分配

对于Java数组的初始化,有以下两种方式,这也是面试中经常考到的经典题目:

静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度,如:

1 //只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为4

2 String[] computers = {"Dell", "Lenovo", "Apple", "Acer"};  //①3 //只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为3

4 String[] names = new String[]{"多啦A梦", "大雄", "静香"};  //②

动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值,如:

1 //只是指定了数组的长度,并没有显示的为数组指定初始值,但是系统会默认给数组数组元素分配初始值为null

2 String[] cars = new String[4];  //③

前面提到,因为Java数组变量是引用类型的变量,所以上述几行初始化语句执行后,三个数组在内存中的分配情况如下图所示:

x81zgv0iobwJAAAAABJRU5ErkJggg==

由上图可知,静态初始化方式,程序员虽然没有指定数组长度,但是系统已经自动帮我们给分配了,而动态初始化方式,程序员虽然没有显示的指定初始化值,但是因为Java数组是引用类型的变量,所以系统也为每个元素分配了初始化值null,当然不同类型的初始化值也是不一样的,假设是基本类型int类型,那么为系统分配的初始化值也是对应的默认值0。

对于多维数组,假设有这么一段代码:

1 int[][] nums = new int[2][2];2 nums[0][1] = 2;

那么他在内存中的分配情况如下:

tJo3UmicdeAAAAAASUVORK5CYII=

由上图可知,并没有真正的多维数组,它的本质其实是一维数组。

2.数组比较特殊,它是属于数组原本类型的一个特殊子类

我们先看一段代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 /**

2 * 重载了info方法的Test类3 * @ClassName: Test4 *@author小学徒5 * @date 2013-3-276 */

7 public classTest{8

9 //info方法一

10 public void info(Object o, doublecount) {11 System.out.println("object o");12 }13

14 //info方法二

15 public void info(Object[] o, doublecount) {16 System.out.println("object[] o");17 }18 public static voidmain(String[] args) {19 //我们看看,如果第一个形参为null,他到底会匹配哪一个方法呢?

20 new Test().info(null, 0);21 }22 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

究竟会匹配哪一个方法呢?我们看一下运行结果:

jg4CDBWcHBQYKzgoODBGcFBwcJzgoODhKcFRwcJP4P6ZksBgz9TmEAAAAASUVORK5CYII=

很奇怪,为什么是object[] o而不是object o呢?

Java方法重载后的匹配规则:如果某个方法的形参要求参数范围越小,那么这个方法就越精确

根据这个规则得出,Object[] o的要求参数范围比Objec o 要求参数范围更小,我就猜测,Object[] o是不是Object o的子类呢?于是我写了以下代码进行验证:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 /**

2 * 使用instanceof有以下三个条件:3 * 1.两类相同 : true4 * 2.前者是后者的父类 : false5 * 3.前者是后者的子类 : true6 * @ClassName: ArrayTest7 *@author小学徒8 * @date 2013-3-279 */

10 public classArrayTest {11 public static voidmain(String[] args) {12 Object[] a = new Object[1];13 Object b = newObject();14 System.out.println(a instanceof Object); //看看Object[]到底是不是属于Object类型

15 System.out.println(b instanceofObject[]);16 }17 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

结果运行结果是:

4vkOSopqZXUAAAAASUVORK5CYII=

根据输出结果和instanceof的使用条件,我们可以得出,Object[] a 是属于Object b的子类;

换句话说,数组比较特殊,它是属于数组原本类型的一个特殊子类。因此Object[] o的要求参数范围比Objec o 要求参数范围更小,在运行Test类的时候,匹配的方法是public void info(Object[] o, doublecount)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值