数组细节
1. 数组创建后,如果没有赋值,有默认值—— int,short,byte,long 为0。float,double为0.0。char为\u0000,String为null,boolean为false。
2. 数组属引用类型,数组型数据是对象。
3. 数组共有三种初始化方式,其中两种动态初始化,一种静态初始化。
//第一种是动态初始化
int[] a = new int[10];//当然也可以是 int a[] = new int[10];
//第二种也是动态初始化
int[] a;
a = new int[10];
//第三种是静态初始化
int[] a = {...};
4. 数组赋值机制——值拷贝/值传递 和 引用传递/地址拷贝 的区别:
基本数据类型使用值拷贝,只把数值赋过去:
int n1 = 2;
int n2 = n1;//这里就是 值传递/值拷贝,只把数值传递过去
n2 = 10;//最终n2为10,n1为2
数组在默认情况下使用引用传递,赋的值是地址:
int[] arr1 = {1,2,3};
int[] arr2 = arr1; //这里就是引用传递/地址拷贝
arr2[0] = 10; //arr1[0]同步修改为10
简朴的数组扩容方法
整体思路:新建一个比原来数组大的数组,然后进行数组复制,把剩下的空位赋为想要的数字,然后让原来的数组指向新数组。
public static void main(String[] args){
Scanner judge = new Scanner(System.in);
int[] arr = {1,2,3,4,5};//原来的数组
char h;
do {
System.out.println("请输入要添加的数字:");
int t = judge.nextInt();//输入要添加的数字
int[] arrNew = new int[arr.length + 1];//新建一个较大的数组
arrNew[arr.length] = t;//把要添加的数组赋给多余位置
for(int i = 0 ;i < arr.length ; i++) {
arrNew[i] = arr[i];//进行数组的复制
}
arr = arrNew;//最关键的一步,让旧数组指向新数组
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println("是否要继续输入?");
h = judge.next().charAt(0);
}while(h == 'y');//可以控制无限循环
}
核心代码:
int[] arrNew = new int[arr.length + 1];//新建一个较大的数组
arrNew[arr.length] = t;//把要添加的数组赋给多余位置
for(int i = 0 ;i < arr.length ; i++) {
arrNew[i] = arr[i];//进行数组的复制
}
arr = arrNew;//最关键的一步,让旧数组指向新数组
结果展示:
数组缩减也是同理,只不过要判断一下是否内容为空。
二维数组
内存示意图
int arr[][] = new int[2][3];
arr[1][1] = 8;
二维数组初始化
1. 与一维数组类似的初始化方法:
//第一种动态初始化方法
int arr[][] = new int[2][3];//int[][] arr = new int[2][3];也可以
//int[] arr[] = new int[2][3];也可以
//第二种动态初始化方法
int arr[][];
arr = new int[2][3];
//静态初始化方法
int arr[][] = {{1,1,1,},{2,3,4},{5,6,7},{9}};
2. 列数不确定的初始化方法:
int arr[][] = new int[3][];//不确定列数的初始化方法
for (int i = 0; i < 3; i++) {
arr[i] = new int[i + 1]; //列数不确定,要分配对应的空间
for (int j = 0; j < i + 1; j++) {
arr[i][j] = j + 1; //给数组赋内容
}
}
arr.length得到总共有多少个数组(行),而arr[i].length得出第i个数组(第i行)共有多少个元素,由于列数是不确定的,因此要单独给每一列分配空间。
两个细节:
int[] x,y[]; //这里x是一维数组,y是二维数组
String strs[] = new String{"a","b","c"}; //报错,错误使用构造
String strs[] = new String[]{"a","b","c"}; //正确
String strs[] = new String[3]{"a","b","c"}; //报错,动态分配和静态分配不能在一起