#数组
所谓数组,是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式,这些按一定顺序排列的同类型数据的集合称为数组。而数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号,逐行递增。
###数组的定义:
方式1:数组元素的类型[] 数组名;例: int[] args;(推荐)
方式2:数组元素的类型 数组名[];例: int args[];
数组必须初始化,才能使用,因为初始化表示在内存中分配空间。
###初始化数组的两种方式:
1.静态初始化
2.动态初始化
无论以哪种方式初始化数组,一单初始化完成,数组的长度就固定了,无法改变,除非重新初始化,也就是说数组是定长的。
###数组的静态初始化操作
特点:由我们自己来为每一个数组元素设置初始化值,而数组的长度由系统决定。
语法:数组元素类型[] 数组名 = new 数组元素类型[]{元素1,元素2,....};
###简单写法:
数组元素类型[] 数组名 = {元素1,元素2,....};
注:简单写法,必须声明之后,立刻进行初始化,用来存储数据
###数组的动态初始化操作:
特点:由我们来设置数组的元素个数(数组长度),而每一个数组元素的初始值由系统决定。
语法:数组元素类型[] 数组名 = new 数组元素类型[length];
###不同数据类型的初始值
类型 | 初始化 |
byte , short , int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
boolean | false |
char | '\u0000'(表示空) |
引用数据类型 | null |
数组基本操作
- 获取元素:数组类型 变量 = 数组名[index];
- 设置元素:数组名[index] = 值;
- 遍历数组元素:建议使用 for 循环(实现已知循环的次数)
- 数组长度:int len = 数组名.length;(length 是属性,不是方法)
- 索引范围:从 0 开始,逐一递增 [0,数组名.length - 1]
####操作数组常见异常:
NullPointerException:空指针异常(空引用异常)。原因,当数组还未被初始化,就直接操作数组。
ArrayIndexOutOfBoundsException:数组索引越界异常
####打印数组元素:
直接打印数组的时候,打印出来的是 hashCode 的十六进制值
####数组的语法:
数组中元素类型[] 数组名;
例 int[][] array = new int[][];
一维数组:数组中每一个元素都是一个值(基本类型和引用类型的值)。
二维数组:数组中每一个元素都是一个一维数组。
三维数组:数组中每一个元素都是一个二维数组。
PS:严格上说,在 Java 中不存在多维数组的概念,和 C 语言作区分,一般称之为数组中的数组。(C 语言的数组相当于矩阵)
在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引)
从 Java5 开始(JDK1.5),Java 提供了一种新的语法,增强for循环(foreach)
####语法:
for(数组元素类型 变量 : 数组名){
循环体
}
通过反编译工具查看字节码,会发现 foreach 其实在底层依然使用 for 循环 + 索引来操作数组。
增强for循环,称之为编译器的新特效–>语法糖
方法的可变参数:Java5 的另一个新特性
####语法:
修饰符 返回值类型 方法名(参数类型 ... 形式参数)
方法的可变参数,其实也是一个语法糖,编译器级别的新特性,让开发者写代码更简单。
方法的可变参数其底层就是一个数组类型:证明方法如下:
1.在方法中打印参数名,会得到一个十六进制hashCode值
2.构造一个同名的数组方法,编译器报错(方法重复)
3.利用反编译工具反编译,会看到编译后的代码
注:可变参数必须作为方法的最后一个参数,避免参数的歧义性。
推论:方法最大只有一个可变参数。
定义一个数组的拷贝方法,能支持任意类型的数组元素拷贝操作(反射),数组拷贝操作,是经常使用到的,SUN 就直接把数组的拷贝操作存放在 JDK 中的 System 类中(src.zip/java/lang)
public static native void arraycopy(Object src,int srcPos,Object dest,int destPos,ini length);
Object : Java 语言中的根类,Object 可以表示任意数据类型,该方法没有方法提,该方法使用了 native 修饰符(本地方法),该方法底层使用 C/C++ 语言实现了功能,Java 直接调用其他语言编写好的功能。