Java散记 (一) 数组

一维数组

1.1 数组的声明和创建

		// 两种先声明
		int[] list1;
		int list2[];
		
		//两种创建
		list1 = new int[3];
		list2 = new int[] {1,2,3};
		
		// 两种声明同时创建
		int[] list3 = new int[3];
		int list4[] = new int[3];


		// 四种声明创建和赋值
		int[] list5 = new int[] {1,2,3};  
		int[] list6 = {1,2,3};
		int list7[] = new int[] {1,2,3};
		int list8[] = {1,2,3};
		
		//以下符值方法错误
		//int[] list5 = new int[3]{1,2,3}
		//int list7[] = new int[3] {1,2,3};
		//给定数组初始值时不能指定大小

1.2 数组的取值和赋值

除了前文的声明的时候赋值,还可以在声明创建之后赋值
		int list1[]=new int[5];  //默认情况下数组内容都为零
		for(int i=0; i<list1.length; i++) {
			list1[i]=i;
		}
数组的遍历
		//两种遍历方法
		for(int i=0;i<list1.length;i++){
			System.out.println("list["+i+"]="+list1[i]);
		}
		for(int i:list1) {
			System.out.println("list["+i+"]="+list1[i]);
		}
输出:
方法一:
list[0]=0
list[1]=1
list[2]=2
list[3]=3
list[4]=4
方法二:
list[0]=0
list[1]=1
list[2]=2
list[3]=3
list[4]=4
地址赋值,改变其中一个数组的一个值,两个数组都改变
		//此处赋值是直接将b这个空间的地址赋值给a
		//所以改变a会改变b
		int[] a= new int[3];
		int[] b= {1,2,3};
		a=b;
		a[0]=0;
		System.out.println("b[0]="+b[0]);
输出:
b[0]=0
数组的实质
		int a[];
		a=new int[3];
		int b[]=new int[4];

		System.out.println("a="+a);
		System.out.println("b="+b);
		a=b;
		System.out.println("a="+a);
		
		for(int i=0;i<4;i++){
			b[i]=i;
		}
		
		for(int i:a) {
			System.out.println("a["+i+"]="+i);
		}
输出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@6d06d69c
a[0]=0
a[1]=1
a[2]=2
a[3]=3

从这里可以看出数组变量实际是存储堆中申请出空间的地址,直接对数组赋值时将空间地址给另一个数组变量,就是两个数组变量操作同一个空间里面储存的值。

值赋值,改变其中一个数组的值,另一个数组不受影响
		int[] a=new int[5];
		int[] b= {1,2,3};
		System.out.println("a="+a);
		System.out.println("b="+b);
		for(int i=0;i<b.length&&i<a.length;i++){
			a[i]=b[i];
		}
		System.out.println("a="+a);
		a[0]=0;
		System.out.println("a[0]="+a[0]);
		System.out.println("b[0]="+b[0]);
		System.out.println("a[3]="+a[3]);
输出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@15db9742
a[0]=0
b[0]=1
a[3]=0

此方法不改变数组a的地址

值赋值,调用方法实现
		int[] a=new int[5];
		int[] b= {1,2,3};
		System.out.println("a="+a);
		System.out.println("b="+b);
		a=Arrays.copyOf(b, 2);
		System.out.println("a="+a);
		a[0]=0;
		System.out.println("a[0]="+a[0]);
		System.out.println("b[0]="+b[0]);
		System.out.println("a[2]="+a[2]);
输出:
a=[I@15db9742
b=[I@6d06d69c
a=[I@7852e922
a[0]=0
b[0]=1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2


代码中可以看出Arrays.copy()方法给a变量返回的值是重新申请空间的地址,且该地址的长度为Arrays.copy()第二个参数的值

2.二维数组

2.1 二维数组的声明和创建

		// 两种先声明
		int[][] list1;
		int list2[][];
		
		//三种种创建
		list1 = new int[3][];
		list1 = new int[2][2];
		//创建时,二维数组的行一定要指定,列可以指定,可以不指定
		list2 = new int[][] {{1,2},{3}};
		
		// 两种声明同时创建
		int[][] list3 = new int[3][];
		int list4[][] = new int[2][2];


		// 四种声明创建和赋值
		int[][] list5 = new int[][] {{1,2},{3}};  
		int[][] list6 = {{1},{2,3}};
		int list7[][] = new int[][] {{1,2},{3}};
		int list8[][] = {{1,2},{3}};

在这里说明一下int[][] list3 = new int[3][];这句代码

		int[][] a=new int[3][];
		System.out.println("a="+a);
		System.out.println("a[0]="+a[0]);
		int[][] b=new int[3][5];
		System.out.println("b="+b);
		System.out.println("b[0]="+b[0]);
		System.out.println("b[0][0]="+b[0][0]);
		a[0]=new int[5];
		System.out.println("a[0]="+a[0]);
		System.out.println("a[0][0]="+a[0][0]);

输出:
a=[[I@15db9742
a[0]=null
b=[[I@6d06d69c
b[0]=[I@7852e922
b[0][0]=0
a[0]=[I@4e25154f
a[0][0]=0

输出结果可以看出int[][] a=new int[3][];int[][] a=new int[3][5];的区别在于一个只申请了a这个空间,一个同时申请了a[]这些以为数组的空间。

2.2 二维数组的取值和赋值

取值与赋值和一维数组类似,其中比较特殊的是可以直接个二维数组的a[]变量赋一维数组的值

		int[][] a=new int[3][];
		a[0]=new int[2];
		a[1]=new int[] {1,2,3};
		int[] b= {1,2,3,4,5};
		a[2]=b;
		for(int[] i:a) {
			for(int j:i) {
				System.out.print(j+" ");
			}
			System.out.println();			
		}
输出:
0 0 
1 2 3 
1 2 3 4 5 

你可能感兴趣的:(散记,数组,Java)