1.二维数组的含义
由行和列组成的表格,尤其对于二维数组而言,无非就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组。
2.二维数组的创建
2.1 创建一个3行3列的二维数组,元素默认都是0
int[][] matrix=new int[3][3];
2.2 创建一个指定元素的二维数组(两种方法)
int[][] matrix=new int[][]{ {1,2,3} ,{5,6,7} ,{9,10,12} };
int[][] matrix={ {1,2,3,4} ,{5,6,7,8} ,{9,10,11,12} };
3.二维数组的应用
import java.util.*;
class Demo57{
public static void main(String[] args){
//调用函数实现数组的赋值
int[] list1=fun();
int[] list2=fun();
//打印两个数组合并的升序数组,转换成字符串输出
System.out.println(Arrays.toString(merge(list1,list2)));
}
/*
有序数组的合并
最主要的问题在于 数组之间有长有短
*/
public static int[] merge(int[] list1,int[] list2){
//判断两个字符串是否为空,为空的话结束
if(list1==null&&list2==null){
return null;
}
//判断两个字符串中是否有空,有空的话返回另外一个
if(list1==null){
return list2;
}
//判断两个字符串中是否有空,有空的话返回另外一个
if(list2==null){
return list1;
}
//只有两个都不是null的情况再考虑具体操作
int[] list3=new int[list1.length+list2.length];
int p1=0;
int p2=0;
int p3=0;
while(true){
//只有当两个数组的长度都遍历完,才结束
if(p1==list1.length&&p2==list2.length){
break;
}
//如果list2数组遍历完,直接把list1后面的元素放到list3中
if(p1<list1.length&&p2==list2.length){
list3[p3++]=list1[p1++];
//如果list1数组遍历完,直接把list2后面的元素放到list3中
}else if(p1==list1.length&&p2<list2.length){
list3[p3++]=list2[p2++];
}else{
//其余的情况就是两个数组当中的元素比较大小,一次往list3放
if(list1[p1]<=list2[p2]){
list3[p3++]=list1[p1++];
}else{
list3[p3++]=list2[p2++];
}
}
}
return list3;
}
public static int[] fun(){
//提示用输入两个数组,进行数组的赋值
System.out.println("请输入两个数组,每次以零结束:");
Scanner scanner=new Scanner(System.in);
int[] arr=new int[0];
while(true){
int num=scanner.nextInt();
if(num==0){
break;
}
arr=kuoChong(arr,arr.length+1);
arr[arr.length-1]=num;
}
return arr;
}
public static int[] kuoChong(int[] arr,int newlen){
//对原来数组的扩充
int[] newarr=new int[newlen];
for(int i=0;i<arr.length;i++){
newarr[i]=arr[i];
}
return newarr;
}
}
/*
举例:
请输入两个数组,每次以零结束:
4 6 7 8 12 46 68 0
请输入两个数组,每次以零结束:
2 3 6 16 18 28 32 88 0
[2, 3, 4, 6, 6, 7, 8, 12, 16, 18, 28, 32, 46, 68, 88]
*/
4. 数组作为引用数据类型和基本数据类型的用法
4.1 基本数据类型传参 传的是常量在常量池中的地址
引用数据类型传参 传的是对象在堆内存中的地址
记住一点,实参——>形参 传的永远是地址
4.2 基本数据类型 是原子型数据 就是不可再拆分
引用数据类型 是复合型数据 当前对象数据中,其实还包括了其他更多的子数据
int a,b,c;-> arr [a,b,c]
复合型数据: 指的就是由多个基本数据或其他引用数据组成的一个数据
4.3 形参变量永远不可能去改变实参中已储存的数据地址 除非return 实参且接收
就算形参变量所存储的数据地址被改变 那也是改变形参自己 与实参无关
无非是:
实参本身指向的是一个对象
然后把这个对象的地址传递给了形参
形参就可以通过该地址去堆内存中找对象,可以修改对象中的数据
实参再去访问对象时,对象中的数据就已经被改变
因为实参和形参目前使用操作的都是同一个对象
4.4 终结总结:
无论实参还是形参 实参就是把变量空间所存的地址给了形参而已
他们都是变量!
所以对于变量的修改而言,主要分两种!
1.要么改变该变量空间所存储的地址
int a=3;
a=7;
int[] arr=new int[]{1,2,3};
arr=new int[]{3,2,1};
2.要么改变该变量空间所存储的地址所指向的那个对象中的数据
int[] arr=new int[]{1,2,3};
arr[0]=10;
对与基本数据类型而言,能否支持2操作 不能