java数组基本概念
数组动态初始化
数组是引用数据类型,有内存分配问题。
数组动态初始化(声明并开辟数组):
数组类型[] 数组名称 = new 数组类型[长度];
int[] data = new int[5];
a.数组通过下标索引来取得元素,默认从0开始。数组下标超出数组长度,抱一个数组越界异常(运行时异常:"java.lang.ArrayIndexOutOfBoundsException)
b.数组中每个元素都有默认值,默认值是该数据类型默认值
c.数组名称.length:取得数组长度
d.数组遍历推荐使用for-each循环(仅限于数组内容读取),要修改数组内容,还是使用常规for循环
public class Test{
public static void main(String[] args){
int[] x = new int[2];//开辟了一个长度为3的数组
System.out.println(x.length);
x[0] = 1;//对数组元素赋值
x[1] = 2;
for(int i:x){ //for-each循环
System.out.println(i);//不使用下标的情况下遍历数组
}
}
}
运行结果:
2
1
2
当然数组也可以分步进行数组实例化:
int[] x = null;
x = new int[3];
数组属于引用数据类型,必须在使用前初始化,否则会NULLPointerException(运行异常)
数组引用传递
public class Test{
public static void main(String[] args){
int[] x = null;
x = new int[3];
System.out.println(x.length);
x[0] = 10;
x[1] = 20;
x[2] = 30;
for(int i:x){
System.out.println(i);
}
}
}
对上述代码进行数组空间分析:
引用传递空间:同一块堆内存空间可以被不同的栈内存所指向。
public class Test{
public static void main(String[] args){
int[] x = null;
int[] temp = null;
x = new int[3];
System.out.println(x.length);
x[0] = 10;
x[1] = 20;
x[2] = 30;
for(int i:x){
System.out.println(i);
}
temp = x;//引用传递
temp[0] = 50;
}
}
内存分析:
引用传递的内存分析都是类似的:同一块堆被不同的栈内存指向。
数组静态初始化
简化格式:数组类型[ ] 数组名称 = {值,值…};
完整格式:数组类型[ ] 数组名称 = new 数组类型[ ]{值,值…};
eg:int[ ] data = new int[ ]{1,3,5,7,9};
在数组定义时直接设置内容,根据值的个数确定数组长度,且长度不可以修改
匿名数组:使用一次就完了,不占用栈空间
System.out.print(new int[]{1,3,5,7,9}[0]);
二维数组
动态初始化
数组类型[ ][ ] 数组名称 = new 数组类型[行个数][列个数]
eg:int[ ][ ] data = new int[3][4];
静态初始化
数组类型[ ][ ] 数组名称 = new 数组类型[ ][ ]{{第一行值},{第二行值},…};
data.length:行长度
data[x].length:列长度
public class Test{
public static void main(String[] args){
int[][] data = new int[3][4];
for(int i = 0;i < 3; i++){
for(int j = 0; j < 4; j++){
System.out.print(data[i][j] + "、");
}
System.out.println(" ");
}
System.out.println(data.length);
System.out.println(data[0].length);
}
}
运行结果:
0、0、0、0、
0、0、0、0、
0、0、0、0、
3
4