数组

1.1 数组类型


1.1.1 理解数组:数组也是一种类型


java的数组要求所有数组元素具有相同的数据类型。因此在一个数组中,数组元素的类型是唯一的。因为java语言是
面向对象语言,能很好的支持类与类之间的继承关系,这样可能产生一个数组里存放多种数据类型的假象:例如一个水果
数组,要求每个数组元素都是水果,实际上数组元素可是苹果,也可以是香蕉,但这个数组元素的类型还是唯一的,只能
是水果类型。

一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变。即使某个数组元素的
数据清空,它所占的空间依然被保留,任然属于该数组,数组的长度依然不变。

1.1.2 定义数组

数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针)
,这个引用变量还未指向任何有效的内存,因此定义数组时不能指定数组的长度。而且由于定义数组仅仅是定义了一个
引用变量,并未指向任何有效的内存空间,所以还没有内存空间来储存数组元素,因此这个数组也不能使用,只有对数组
初始化后才能使用。
注意:定义数组时不能指定数组的长度。

1.1.3 数组的初始化

java语言中数组必须先初始化后才能使用,所谓初始化,就是为数组的元素分配内存空间,并为每个数组元素赋初始值。

数据的初始化有两种方式:
静态初始化:初始化时由程序员显示指定每个数组的初始值,有系统决定需要的数组长度。
int[] array = new int[]{1,2,3};
动态初始化:初始化时程序员只指定数组长度,由系统为每个数组元素分配初始值。
int [] array = new int[3];


1.1.4 内存中的数组

数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存中是分开的
数组引用变量可以指向任何一个有效的内存,只有当该引用指向有效内存后,才可通过该数组变量访问数组元素。
实际的数组元素被存放在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存放在栈(stack)内存中。

那为什么会有栈内存和堆内存之分?
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的
执行结束,这个方法的内存栈也将自然销毁了。因此在方法中定义的变量都是存放在栈内存中的;当我们在程序中创建一个
对象的时候,这个对象将被保存到运行时数据区中,以便反复使用(因为对象的创建成本通常较大),这个运行时数据区就是
堆内存。堆内存中的对象不会随方法的结束而销毁,即方法结束后,这个对象还可能被另一个引用变量所引用(方法中的参数)
传递时很常见),则这个对象不会被销毁。只有当一个对象没有被任何引用变量引用它时,系统的垃圾回收机制才会在合适的
时候回收它。

如果堆内存中的数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占的内存将会被系统的垃圾回收机制
回收。因此,为了让垃圾回收机制回收一个数组所占的内存空间,则可以将数组变量赋为null,也就切断了数组引用变量
和实际数组之间的引用关系,实际数组 也就成了垃圾。

只要类型相互兼容,可以让一个数组变量指向另一个实际的数组,这种操作会产生数组的长度可变的错觉。如下面代码:

<span style="white-space:pre">	</span>public static void main(String[] args) {
		//定义并初始化数组,使用静态初始化
		int[] a = new int[]{2,3,5};
		//定义并初始化数组,使用动态初始化
		int[]b = new int[4];
		System.out.println("a的长度" + a.length);
		System.out.println("b的长度" + b.length);
		//循环输入数组a的值
		for(int a1 : a){
			System.out.println(a1);
		}
		//循环输入数组b的值
		for(int b1 : b){
			System.out.println(b1);
		}
		
		b = a;
		System.out.println("b的长度" + b.length);
		for( int b2 : b){
			System.out.println(b2);
		}
	}


运行上面的代码后,将可以看到a的长度是3,b的长度是4,然后依次输出数组a和b的元素的值。接着会输出b的长度3,
然后输入数组b每个元素的值和数组a元素的值相同。看起来似乎数组的长度是可变的,但这只是一个假象。必须牢记:定义
并初始化一个数组之后,在内存里分配了两个空间,一个用于存放数组的引用变量,一个用于存放数组本身。当执行b=a代码
时,系统会把a的值赋给b,a和b都是引用类型变量,存储的是地址。因此把a的值赋给b后,就是让b指向a所指向的地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值