初识数组,内存组织-----《java课堂随笔3》
一、数组
1.为什么要有数组?
所有学生的学号
String stuId1
String stuId2
String stuId3
String stuId4
在有大量相同类型元素需要处理的情况下引入数组的概念{或者使用集合(List、Set、Map)、留待后文详解,此处只谈数组}
2.数组的概念
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器
1)数组既可以存放基本数据类型元素,也可以存放引用数据类型元素
2)数组本身是引用数据类型
3)初始化之后长度不可改变,下图解释了为何长度不可改变
int a = 1;
int b = 100;
int[] arr = new int[2];
arr = new int [3];
arr = null;
/* 对以上代码在RAM 中的组织形式解释如下所示
* a、b都是基本数据类型,java在存储时把基本数据类型的变量存贮在栈中,如图。
* arr 初始化时指向了一个长度为二的int型数组,arr为该数组的引用,存储在栈中。
* 而真正的数组存储在堆中,栈中的arr只是存储了数组第一个元素的首地址。
* 我们称arr为引用,(此处可类比C中的指针理解)。
* 第三行代码建立一个二元素数组,并把首地址0x0010存入arr中。
* 第四行代码建立一个三元素组并把0x0010改写成0x0080,断开arr与二元素数组的联系,建立起与三元素数组的链接。
* 第五行代码将arr的值置空,断开与三元素数组的链接。
*/
注:通过以上过程我们不难发现,“初始化后长度不可改变”,完全正确。因为改变的只是引用,堆中的数组本身没有发生任何变化,未被引用的数组占用内存在一定的时间过后会被java的垃圾回收机制回收(GC)。
3.数组的定义
数据类型[] 数组名;
数据类型 数组名[];
4.数组的初始化
1)静态初始化
//初始化时指定每个数组元素的初始值,由系统决定数组长度
int[] arr = new int[] {1, 2, 3};
int[] arr = {1, 2, 3};
2)动态初始化
//初始化时只指定数组长度,由系统为数组分配初始值
int[] arr = new int[5];
/*动态初始化,系统为每个元素指定初始值
*基本数据类型的初始值
*|-byte 0
*|-short 0
*|-int 0
*|-long 0
*|-double 0.0
*|-float 0.0
*|-boolean false
*|-char 0
*引用数据类型----null
* |-String null
*/
3)数组的长度
//数组名.length;
int arr[] = new int[5];
Ststem.out.println(arr.length);
//输出数组arr的长度
4)访问数组中的元素
数组名[下标]
下标的范围 0 ~ 数组的长度-1
5.常见问题
ArrayIndexOutOfBoundsException--下标越界异常
NullPointerException--空指针异常
6.数组常见操作
1)遍历---for循环,增强for循环遍历数组,下一篇详解
2)求最值---遍历交换
3)逆序---遍历,两个控制变量实现前后交换
7.数组一旦初始化,长度不可改变
栈----
|----基本数据类型变量
|----引用---生成对象时,赋值左侧的内容
堆----
|----对象,数组---通过new生成的区域
详细解释已在数组的概念中详述,不再赘述