1.数组的概念
数组是一种数据结构,它可以存储相同数据类型的固定大小的元素集合,每个元素都由至少一个数组索引或键标识。最简单的数据结构类型是线性数组,也称为一维数组。
2.一维数组的使用
2.1 一维数组的初始化
public class CreateArray {
public static void main(String args[]) {
//静态初始化
int[] arr;
arr=new int[]{1,2,3,4};
//或者使用类型推断
int[] arr={1,2,3,4}
//动态初始化
String[] str=new String[5];
//一维数组的长度
int arrLength=arr.length;
//一维数组的遍历
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
}
}
2.2 Java数组在内存中的存放
数组属于引用数据类型,发生引用传递。
Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域:
栈被用来寻出局部变量,对存入其中的变量不会自动赋值,变量在使用完成之后会立即移出栈内存释放空间;对应int[] arr;
堆被用来存储对象(所有new出来的东西),堆内存对于存入其中的元素会自动的赋予初始值,对象使用完成之后不会立即移出堆内存,而是在不定的某个时刻被回收;对应arr=new int[]{1,2,3,4};在这行代码里,arr变量存放了数组对象的引用,数组对象所占的空间在堆上被分配,然后返回其引用;
在堆中有一个首地址值,用十六进制的数表示,这个地址值被赋给栈空间中的局部变量,栈通过这个地址值找到堆中的数组。最开始的时候堆中数组先被赋予初始值,再被赋上给定的值。
如果重新new了一次(如下图arr1=new String[3];),堆空间中会被开辟新的对象(0x566),指向原来堆空间中数组(0x12ab)的指针会消失。垃圾回收机制会判断原来堆中的那个数组(0x12ab)是否被栈引用,如果没有则在之后某个不确定的时间被当成垃圾回收。如果在程序执行完后栈中变量被删除,堆中的对象也没有引用指向它们了,所以也会被当成垃圾回收。
2.3 数组元素的默认初始化值
数组元素在堆中有如下默认初始化值, 如果初始化数组时不赋值将会被输出为:
1.数组元素是整型(byte,short,int,long):0
2.数组元素是浮点数:0.0
3.数组元素是char型:ASCII码中存储字符地址为0的地方,值为0但输出是空格,或称为'\u0000'
4.数组元素是boolean型:false
5.元素是引用数据类型(String、类、数组、接口):null
3.二维数组的使用
3.1 二维数组的初始化
public class TwoDimentionalArray {
public static void main(String args[]) {
//静态初始化的几种合法方法
int[][] arr1=new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr1[]=new int[][]{{1,2,3},{4,5},{6,7,8}};
int[][] arr1={{1,2,3},{4,5},{6,7,8}};
//动态初始化的几种合法方法
int[][] arr2=new int[3][];
int[][] arr2=new int[3][2];
//不合法的用法
int[][] arr2=new int[][2];
int[4][3] arr2=new int[][];
int[][] arr2=new int[3][2]{{1,2,3},{4,5},{6,7,8}};//后面赋值了前面就不能有长度
//二维数组的长度
System.out.println(arr1.length);//3 为二维数组的行数
Syetem.out.println(arr1[0].length)//3 二维数组第0行的列数
System.out.println(arr1[1].length)//2
遍历二维数组
for(int i=0;i<arr1.length;i++)
{
for(int j=0;j<arr1[i].length;j++)
{
System.out.println(arr1[i][j]);
}
}
}
}
3.2 二维数组的内存解析
public class TwoDimentionalArray {
public static void main(String args[]) {
int[][] arr=new int[3][3];
System.out.println(arr[0]);//[I@15db9742 输出的是arr[0]的地址
System.out.println(arr[0][0]);//0
System.out.println(arr);//[[I@6d06d69c 输出的是arr的地址
int[][] arr=new int[3][];
System.out.println(arr[1]);//内层元素没有初始化所以是输出null
System.out.println(arr[1]);//会报错java.lang.NullPointerException空指针异常
//因为arr[1]处没有指针
}
}