主页 » 书柜 » 数组的几点基础

数组的几点基础

2015-04-012条评论

一、数组变量与数组对象的初始化问题

大部分时候,我们把数组变量和数组对象搞混了,数组变量只是一个引用变量(有点类似于C语言里的指针),通常存放在栈内存中(也可被放入对内存中);而数组对象就是保存在对内存中的连续内存空间。对数组执行初始化,其实并不是对数组变量执行初始化,而是对数组对象执行初始化——也就是为该数组对象分配一块连续的内存空间,这块连续内存空间的长度就是数组的长度。

对于数组变量来说,它并不需要进行所谓的初始化,只要让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。

对于java程序中所有的引用变量,他们都不需要经过所谓的初始化操作,需要进行初始化操作的是该引用变量所引用的对象。比如数组变量不需要进行初始化操作,而数组对象本身需要进行初始化;对象的引用变量也不需要进行初始化,而对象本身才需要进行初始化。

二、数组的内存分配问题

有些书籍总是重复:基本类型变量的值存储在栈内存中,其实这句话是完全错误的,示例: int[] arr = new int[]{1,2,5,400};而数组对象的值是基本数据类型(整型)存储在堆内存中。所以正确的来说:所有局部变量都是放在栈内存里保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈中;但引用类型变量所引用的对象(包括数组、普通java对象)则总是存储在堆内存中。
注:基本类型就是字面量值,引用类型就是地址值。对于Java语言而言,堆内存中的对象(不管是数组对象,还是普通的Java对象)通常不允许直接访问,为了访问堆内存中的对象,通常只能通过引用变量。

三、数组扩容 原理

1)Java数组对象的大小是固定不变的,数组对象是不可扩容的。

2)利用数组复制方法可以变通的实现数组扩容。

3)System.arraycopy()可以复制数组。

4)Arrays.copyOf()可以简便的创建数组副本。

5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容。

相关文章