目录
一、数组的概念(含一些快捷键用法)
多个相同类型数据,按一定顺序排列的集合
1.数组的特点:
1)有序排列
2)数组属于【就是】引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。【数组是引用,数组的元素是基本或引用】
3)创建数组对象会在内存中开辟一整块连续的空间
4)数组的长度一旦确定,就不能修改。
2. 数组的分类:
① 按照维数:一维数组、二维数组、。。。
② 按照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
3. 一维数组的使用
① 一维数组的声明和初始化
int[] ids;//声明
//1.1 静态初始化:数组的初始化和数组元素的赋值操作【同时】进行
ids = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作【分开】进行
String[] names = new String[5];//【[]意思是,names变量是数组类型的】
//错误的写法:
// int[] arr1 = new int[];即没给数组元素赋值,也没指定数组长度
// int[5] arr2 = new int[5];
// int[] arr3 = new int[3]{1,2,3};动静
//也是正确的写法:
int[] arr4 = {1,2,3,4,5};//类型推断
int[] ids;
//1.1静态初始化
ids = new int[]{1001,1002,1003,1004};//【只要是new的结构都在堆空间中开辟】
System.out.println(ids);//[I@15db9742
//1.2动态初始化
String[] names = new String[5];//长度是5,从0开始,0~4
names[0] = "张三";
names[1] = "李四";//获取李四字符串第一个李,用charAt(0)
names[4] = "王五";//【复制:ctrl+alt+下】
② 如何调用数组的指定位置的元素
names[4] = "王宏志";//charAt(0)获取王
// System.out.println(names[0]);//单行注释:ctrl+/
// System.out.println(names[1]);//多行注释:ctrl+shift+/
// System.out.println(names[2]);//删除多行注释:ctrl+shift+\
③ 如何获取数组的长度
//属性:length
System.out.println(names.length);//5
System.out.println(ids.length);
④ 如何遍历数组
for(int i = 0;i < names.length;i++){
System.out.println(names[i]);
}
⑤ 数组元素的默认初始化值 :
> 数组元素是整型:0
> 数组元素是浮点型:0.0
> 数组元素是char型:0或'\u0000',而非'0'
'a' ascii码 是 97
'0' ...
... 是 0【char型数组元素的默认值是这个0,输出效果像空格】
空格 是...
> 数组元素是boolean型:false【底层都是二进制,false用0充当】
> 数组元素是引用数据类型:null 空值 【不是"null","null"是字符串】
⑥ 数组的内存解析 :
过了main{}后,s从栈中弹出,箭头消失,int[]对象消失
练习
public static void main(String[] args) {
//双击ArrayDemo1.java,窗口变大或变小
Scanner scanner = new Scanner(System.in);//自动导包:ctrl+shift+o
System.out.println("请输入学生人数:");
//无论光标在哪,向下换行:shift+enter
//向上换行:ctrl+shift+enter
int number = scanner.nextInt();//自动补充变量名和类型:ctrl+1
int[] scores = new int[number];
System.out.println("输入" + number + "个学生成绩:");
int maxScore = 0;
for(int i = 0;i < scores.length;i++){
scores[i] = scanner.nextInt();
if(maxScore < scores[i]){
maxScore = scores[i];
}
}
/* //获得数组元素的最大值
int maxScore = 0;
for(int i = 0;i < scores.length;i++){
if(maxScore < scores[i]){
maxScore = scores[i];
}
}*/
char level;
for(int i = 0;i < scores.length;i++){
if(maxScore - scores[i] <= 10) {
level = 'A';
}else if(maxScore - scores[i] <= 20){
level = 'B';
}else if(maxScore - scores[i] <= 30){
level = 'C';
}else{
level = 'D';
}
System.out.println("student " + i +
" score is " + scores[i] + " ,grade is " + level);
}
}
二、二维数组
【数组是引用数据类型(类,接口,数组),数组的元素可以是基本数据类型或引用数据类型(数组),二维数组就是:一维数组,一维数组的元素还是数组】
1.理解:
对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
其实,从数组底层的运行机制来看,其实没有多维数组。
*
* 2. 二维数组的使用:
* ① 二维数组的声明和初始化
//1.二维数组的声明和初始化
int[] arr = new int[]{1,2,3};//一维数组
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
//错误的情况
// String[][] arr4 = new String[][4];
// String[4][3] arr5 = new String[][];
// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
//也是正确的写法:
int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};
② 如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null【元素是String(引用)类型的,初始化值null】
System.out.println(arr3[1]);
//null【还没给arr3[1] = new String[4];
//此时这个长度为4的数组不存在,也就没有地址值,arr[3]中没有射出的箭头,所以是null】
//【重点理解】
arr3[1] = new String[4];
System.out.println(arr3[1][0]);
③ 如何获取数组的长度
System.out.println(arr4.length);//3【因为不存在多维数组,arr4是一维数组,所以数组长度是3,图】
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//4
④ 如何遍历数组
for(int i = 0;i < arr4.length;i++){
for(int j = 0;j < arr4[i].length;j++){
System.out.print(arr4[i][j] + " ");
}
System.out.println();
}
⑤ 数组元素的默认初始化值
规定:二维数组分为外层数组的元素,内层数组的元素。
【因为内层元素和外层元素初始化值有区别】
int[][] arr = new int[4][3];
外层元素:arr[0],arr[1]等
内层元素:arr[0][0],arr[1][2]等
针对于初始化方式一:比如:int[][] arr = new int[4][3];
外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组初始化情况相同
针对于初始化方式二:比如:int[][] arr = new int[4][];
外层元素的初始化值为:null
内层元素的初始化值为:不能调用,否则报错。
//source->format,调整格式快捷键:ctrl+shift+f
int[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742 一个[代表一维,I代表int型,@十六进制
//【类比输出一维数组System.out.println(arr);】
System.out.println(arr[0][0]);//0
// System.out.println(arr);//[[I@6d06d69c [[二维数组
System.out.println("*****************");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//地址值
System.out.println(arr1[0][0]);//0.0
System.out.println("*****************");
String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//地址值
System.out.println(arr2[1][1]);//null
System.out.println("*****************");
double[][] arr3 = new double[4][];//【换了初始化方式,第二个[]没填数字】
System.out.println(arr3[1]);//null
// System.out.println(arr3[1][0]);//【报错】
⑥ 数组的内存解析 :
练习
三、Arrays工具类
java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
//1.boolean equals(int[] a,int[] b):判断两个数组是否相等。
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4};
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals);
//2.String toString(int[] a):输出数组信息。
System.out.println(Arrays.toString(arr1));
//3.void fill(int[] a,int val):将指定值填充到数组之中。
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));
//4.void sort(int[] a):对数组进行排序。
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//5.int binarySearch(int[] a,int key)
int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
int index = Arrays.binarySearch(arr3, 210);
if(index >= 0){
System.out.println(index);
}else{
System.out.println("未找到");
}
四、数组的异常
* 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
*
* 2. 空指针异常:NullPointerException
//1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1,2,3,4,5};
// for(int i = 0;i <= arr.length;i++){
// System.out.println(arr[i]);
// }
// System.out.println(arr[-2]);
//2.2. 空指针异常:NullPointerException
//情况一:
// int[] arr1 = new int[]{1,2,3};
// arr1 = null;//【栈里的arr1就没地址了,无法箭头(箭头就是指针)指向堆】
// System.out.println(arr1[0]);
//情况二:
// int[][] arr2 = new int[4][];
//【画下图。
//初始化值不牢固,arr2[1]的值不是地址值是null,一维数组还没初始化,就没地址值赋给二维数组】
// System.out.println(arr2[0][0]);//arr2[0]是null,没地址,没箭头,空指针
//情况三:
String[] arr3 = new String[]{"AA","BB","CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());//null会导致空指针