1.6Java数组基本概念

1.定义:同一类型数据的集合。数组 [ ] 是一个容器实体,实体在内存中需要关键字new新建。当没有给实体赋值时,Java会给实体自动初始化。
好处:自动给数组中的元素从0开始编号,方便操作。

格式:
    元素类型 [ ] 数组名 = new 元素类型 [ 元素个数或数组长度 ]
    int  [ ]  arr =  new int [ 5 ];

分析: 等号左面定义 数组名,存放在堆中新建的数组的首地址。右边在堆中新建 数组。
操作数组元素:arr[ 0 ] ,通过数组名里的首地址,访问数组中对应角标的元素。

2.内存空间的划分:
1.寄存器 : CPU处理的
2.本地方法区:和本地系统版本相关
3.方法区:类加载技术相关
4.栈内存
5.堆内存

栈:存储的都是局部变量。凡是定义在方法中的变量都是局部变量。生命周期短,更新速度快。
局部变量所属的作用域一旦结束,该变量就会自动释放。(如for循环中定义的循环变量)
局部代码块:{ },定义一个区间,限定局部变量的生命周期,释放内存。(大程序用,加载的变量多占内存,考虑局部变量的释放情况,不多见)

堆:存储的是对象(数组也是对象),凡是new建立都在堆中。
堆里面存的都是实体,数组和对象都是实体。实体的作用是封装多个数据。

int  [ ]  arr =  new int [ 5 ];
内存分析:
①主函数或其他函数先加载进 栈内存,在栈中给数组名arr开辟空间。
②然后通过new在堆内存中开辟一个数组实体空间,并分配一个内存地址(数组的首元素地址),简洁用十六进制表示。数组中用角标表示每个元素位置。
③最后把实体的内存地址赋值给 arr。 

数组名arr称为引用数据类型。C++叫指针,Java叫引用。

内存分析

当没有给实体赋值时,Java会给实体默认自动初始化:
byte short int long   默认0
double float  默认0.00.0f
boolean    默认false
char  默认 ' \u0000 ' 
引用型  默认NULL(比如定义未初始化二维数组时,内存分析第一维时存放的是NULL,分析到第二维的时候再把第二维的数组地址放到第一维内存替换NULL)
arr = null ;
取消引用类型的指向,arr是数组类型,引用数据类型是一种,只能指向实体。此时如果继续操作数组,会报空指针异常java.lang.NullPointerException。

这时堆中的数组会被视为垃圾,在不定时的时间内自动回收,Jvm中有垃圾回收机制,用于监测堆中的垃圾,不定时做回收动作(垃圾量多时回收)。(C++堆内存垃圾由程序员通过析构函数手动回收)

null不会用于基本数据类型

多个引用变量可以同时指向一个实体。

特点小结:
1.每一个实体都有首地址值。
2.堆内存中的每一个变量都有默认初始化值,根据类型不同而不同。

3.常见问题:

1.内存的划分是在运行的时候进行的,编译的时候不会检查数组角标是否越界或数组空指针异常。

当访问到数组中不存在的角标时,运行时会报数组角标越界异常java.lang.ArrayIndexOutOfBoundsException。

当引用型变量没有任何实体指向时,还在用其操作实体,运行时就报空指针异常
java.lang.NullPointerException2.
System.out.print(arr);  //  打印出   [I@5c3a5635
做测试的时候偶尔用一下,当你不知道这个变量接收的是什么类型的实体时。看@左边的即可。

[I@5c3a5635: 左边表示实体类型,右边表示实体的哈希值

5c3a5635: 数组实体的哈希值,哈希是一种算法,用来定义数组实体在内存当中存储的位置(地址值)。Java是调用windows的哈希算法来算实体在内存中的存储位置,开辟内存空间由windows说了算。

[ I  : 表示实体类型 和 实体数据类型 ,这里表示整型数组。

4.第二种定义格式:赋初始值
①常规new方式:元素类型 [ ] 数组名 = new 元素类型 [ ] { 元素1,… }
int [ ] arr = new int[ ] { 1,2,3 };

②静态初始化方式:元素类型 [ ] 数组名 = { 元素1... }
int [ ] arr = { 1,2,3 };
一点小差别:在重新赋值或传参的时候。

定义选择:

int  [ ]  arr =  new int [ 5 ];   //需要一个容器,确定数组的长度,但是不明确容器的具体数据时。
int [ ] arr = { 1,2,3 };      //需要一个容器,存储已知的具体数据。

习惯养成:数据只要一多,就用数组存起来。

发布了36 篇原创文章 · 获赞 0 · 访问量 4579
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章