Java学习回忆录-基础语法-006
数组
数组是一种容器, 装数据的. 变量一次只能存储一条数据,而数组可以存储多条数据.。
严谨: 数组多个数值(类型一样的) 。
// 语法:
// 声明数组
String names[];
// 数组初始化
names = new String[4];
// 声明加初始化一步到位
String names = new String[4];
数组的申明:
-
数组类型[ ] 数组名 ;
数组名 = new 数组类型[数组大小]; -
数据类型[ ] 数组名 = new 数据类型 [数组大小]
-
数据类型[ ] 数组名 = {数据1,数据2…}
1. 定义一个数组:
数据类型[ ] 数组名;
初始化一个数组
数组名 = new 数据类型[数组大小];
2. 在定义的时候就初始化:(动态初始化)
数据类型[ ] 数组名 = new 数据类型[数组大小];
3. 在定义的同时就赋初值(静态初始化)
数据类型[ ] 数组名 = {数据1,数据2…}
获取数组的最大长度:
数组名.length
数组理解:
数据类型[ ] 数组名 = new 数据类型 [数组大小]
左边:声明数组
int[] arr
arr: 数组的名字
int : 数组中存储元素(数据)的类型
[] : 规定这是一个数组.
如果你不添加[],int arr; 就会变为一个普通的变量
只是声明了一个数组,还不存在的.
右边
new 操作符,会在堆内存中开辟空间,空间多大. (多大内存需要明确)
new int : 确定了存储的元素是int的,
int[3]: 确定了存储的数据的个数是3个,内存至少需要12个字节...
new 操作符在堆内存中开辟空间(数组)时,会对每一个位置进行编号,这个编号称之为角标(索引)。
new 操作符在堆内存中开辟空间(数组),会对每一个位置初始化一个默认值, 存储的是int 值,默认是0。
new 操作符在堆内存中开辟空间(数组),分配一个地址值. 通过地址值可以确定这个数组的位置.就可以操作数组。并且new 操作符会将这个数组的地址值,赋值给arr。左边和右边就建立联系。
数组操作:
1. 取出数组中的元素
数组名[角标]
2. 给数组中指定位置赋值
数组名[角标]=数值;
数组的内存分析
内存:
java 程序在运行时,会分配内存, 为了提升程序运行的速度,将内存细分,不同区域的内存内部存储和处理数据的方式不同.
栈内存
局部变量就在栈内存. 到今天为止,我们定义的变量都是局部变量,都在栈内存中...
局部变量,使用前必须要初始化(栈中)
堆内存
new 出来的,是在堆内存中.
数组: 就是在堆内存中.
数组内存的分析
栈内存:
数组名字
堆内存:
真正的数组.
数组名和数组通过地址值建立的联系.
数组的常见问题
问题一:
数组角标越界
ArrayIndexOutOfBoundsException
导致问题的原因: 操作数组时,方位了不存在的角标.
问题二:
空指针异常
NullPointerException
导致问题的原因: 数组没有初始化,或者数组名存储的是null.
注意:
定义一个方法前需要分析它的返回值和他的参数列表
当定义一个数组时,只要定义了它的长度,无论有没有赋值,它的长度就不再为0;
定义一个int型的数组时,它的默认值为0,double类型的默认值是 0.0
定义一个String类型的数组时,它的默认值是null
很奇怪,char类型的数组竟然没有默认值,但是有数组长度,输出是一片空白
char类型的数组它的默认值是 /u0000,实际输出来的是一个空格。
数组的长度可以定义为 0;....这个是没有意义的,虽然可以定义,但是没有访问的区间,所以毫无用处。
字符串的比较不能用 == ,要用String类中的equals();
equals方法使用规则:
要比较的字符串 . equals(要比较的字符串);
char数组直接打印数组名会输出整个数组。