一、数组的概述
- 数组的理解:数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组的相关概念:
- 数组名
- 元素
- 角标,下标,索引
- 数组的长度:元素的个数
数组的特点:
- 数组是有序排列的
- 数组属于引用数据类型的变量,数组的元素,既可以是基本数据类型,也可以是引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
- 数组的长度一旦确定,就不能修改 (修改就要造一个新的)
- new是从堆中开辟空间
数组的分类
- 按照维数:一维数组、二维数组
- 按照数组元素:基本数据类型元素的数组、引用数据类型元素的数组
二、一维数组的使用
- 一维数组的声明和初始化
- 如何调用数组的指定位置的元素(数组元素引用)
- 如何获取数组的长度
- 如何遍历数组
- 数组元素的默认初始化值
- 数组的内存解析
2.1 一维数组的声明和初始化
- 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3];arr[0] = 3;arr[1] = 9;arr[2] = 8;String names[];names = new String[3];names[0] = “钱学森”;names[1] = “邓稼先”;names[2] = “袁隆平”;
- 静态初始化:在定义数组的同时就为数组元素分配空间并赋值
int arr[] = new int[]{ 3, 9, 8};或int[] arr = {3,9,8};//类型推断String names[] = {“李四光”,“茅以升”,“华罗庚” };//类型推断
2.2 数组元素的引用方式:数组名[数组元素下标]
- 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
数组元素的引用方式:数组名[数组元素下标]
- 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
- 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[] = new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
2.3 数组元素的默认初始化值
- 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长
度(元素个数) ,数组一旦初始化,其长度是不可变的
package com.atguigu.java;public class ArrayTest {public static void main(String[] args){//1.一维数组的声明和初始化int num;//声明num = 10;//初始化int id = 1001;//声明 + 初始化int[] ids;//声明//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行ids = new int[]{1001,1002,1003};int[] arr = {3,9,8};//类型推断String names[] = {"AA","BB","CC"};//类型推断//1.2 动态初始化:数组的初始化和数组元素的赋值操作分开进行String[] names = new String[5];//错误的写法// int[] arr1 = new int[];//后边没写// int[] arr3 = new int[3]{1,2,3};//不能加3//总结:数组一旦初始化完成,其长度就确定了。//2.如何调用数组指定位置的元素:通过索引的方式//数组的角标(或索引)从0开始的,到数组长度-1结束names[0] = "战国0";names[1] = "春秋1";names[2] = "隋唐2";names[3] = "大宋3";names[4] = "明清4";//names[5] = "4";//数组下标越界//3.如何获取数组的长度。//属性:lengthSystem.out.println(names.length);System.out.println(ids.length);//4.如何遍历数组//快捷注释ctrl+shift+斜杆//解除快捷注释ctrl+shift+反斜杆/*System.out.println(names[0]);System.out.println(names[0]);System.out.println(names[0]);System.out.println(names[0]);System.out.println(names[0]);*/for(int i = 0;i < names.length;i++){System.out.println(names[i]);}}}
2.5 数组元素的默认初始值
对于基本数据类型而言,默认初始化值各有不同
- 数组元素是整型:0
- 数组元素是浮点型:0.0
- 数组元素是char型:0或’\u0000’,而非’0’
- 数组元素是boolean型:false
- 对于引用数据类型而言,默认初始化值为null(注意与0不同!)
package com.atguigu.java;/** 5.数组元素的默认初始值* byte short int long* >数组元素是整型:0* >数组元素是浮点型:0.0* >数组元素是char型:0或'\u0000',而非'0'* >数组元素是boolean型:false true* >数组元素时引用数据类型:null*/public class ArrayTest1 {public static void main(String[] args){//5.数组元素的默认初始化值int[] arr = new int[4];//动态for(int i = 0;i < arr.length;i++){System.out.println(arr[i]);}System.out.println("*****************");short[] arr1 = new short[4];for(int i = 0;i < arr.length;i++){System.out.println(arr[i]);}System.out.println("*****************");float[] arr2 = new float[5];for(int i = 0;i < arr2.length;i++){System.out.println(arr2[i]);}//float默认类型为0.0System.out.println("*****************");char[] arr3 = new char[4];for(int i =0;i < arr3.length; i++){System.out.println("-----" + arr3[i] + "-----");}//char默认为0if(arr[3] == 0){System.out.println("char默认类型为0");}System.out.println("*************");boolean[] arr4 =new boolean[5];//用动态初始化去测System.out.println(arr4[0]);//boolean默认为falseSystem.out.println("*************");String[] arr5 = new String[5];System.out.println(arr5[0]);//String默认为nullif(arr5[0] == null){System.out.println("String默认为null");}}}
2.6 数组的内存解析
2.6.1 内存简化结构
2.6.2 一维数组的内存解析
- 放在方法中的变量都叫做局部变量
第一行代码new出来的放在堆中
- 首地址值0x34ab赋值给arr
- 第二行代码new出来的放在堆中(new出来的结构在堆中重新开辟空间)
- 第三行代码进行赋值
- 第四行代码:看到new,重新开辟空间
2.7 一维数组的使用:练习题
2.7.1 一维数组课后练习题1
升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。
package com.atguigu.exer;public class ArrayDemo {public static void main(String[] args) {int[] arr = new int[]{8,2,1,0,3};int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};String tel = "";for(int i = 0;i < index.length;i++){tel += arr[index[i]];}System.out.println("联系方式:" + tel);//18..}}
2.7.2 一维数组课后练习题2
CTRL+SHIFT+回车:上面一行
SHIFT+回车:下面一行
package com.atguigu.exer;/*从键盘读入学生成绩,找出最高分,并输出学生成绩等级。成绩>=最高分-10 等级为’A’成绩>=最高分-20 等级为’B’成绩>=最高分-30 等级为’C’其余 等级为’D’提示:先读入学生人数,根据人数创建int数组,存放学生成绩。*/import java.util.Scanner;class ArrayDemo1 {public static void main(String[] args) {//1.使用Scanner,读取学生个数Scanner scanner = new Scanner(System.in);System.out.print("请输入数组元素个数");int n = scanner.nextInt();//创建数组,存储学生成绩,int[] score = new int[n];//动态初始化//给数组赋值for(int i = 0;i < n;i++){System.out.print("请输入数组元素(整型)");score[i] = scanner.nextInt();}System.out.print("输出数组元素(整型)");for(int i = 0;i < n;i++){System.out.print(score[i]);}for(int i = 0;i < n-1;i++){//n-1趟for(int j = 0; j < n - 1 - i;j++){//如果n为4,第一趟比较为3次if(score[j] > score[j + 1]){int temp = score[j];score[j] = score[j + 1];score[j + 1] = temp;}}}System.out.print("输出排序后的数组元素(整型)");for(int i = 0;i < n;i++){System.out.println(score[i]);}int max = score[n-1];System.out.print("最高分为" + max);char level;for(int i = 0;i < score.length;i++ ){if(max - score[i] <= 10){level = 'A';}else if(max - score[i] <= 20){level = 'B';}else if(max - score[i] <= 30){level = 'C';}else{level = 'D';}System.out.println("student " + i +"score is" + score[i] + ",grade is " + level);}}}
三、二维数组的使用
3.1 理解
对于二维数组的理解,可以看成一维数组array1又作为另一个一维数组array2得元素而存在。其实,从数组底层得运作机制来看,没有多维数组
引用类型就两种情况:要么null(没赋值),要么地址值
3.2 二维数组的使用
①二维数组的声明和初始化
②如何调用数组的指定位置的元素
③如何获取数组的长度
④如何遍历数组
⑤数组元素的默认初始化值
⑥数组的内存解析
- 1、2、3、4 ```java package com.atguigu.java;
public class ArrayTest2 {
public static void main(String[] args) {//1.二维数组的声明和初始化int[] arr = new int[]{1,2,3};//一维数组//二维数组静态初始化int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};//动态初始化1String[][] arr2 = new String[3][2];//arr1[0][0]默认为0//动态初始化2String[][] arr3 = new String[3][];//错误的情况//String[][] arr4 = new String[][4];//int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7}};//也是正确的写法int arr4[][] = new int[][]{{1,2,3},{4,5,6,8},{6,7,8}};//[][]放后面int arr5[][] = {{1,2,3},{4,5},{6,7,8}};//类型推断//2.如何调用数组的指定位置元素System.out.println(arr1[0][1]);//2System.out.println(arr2[1][1]);//默认null//System.out.println(arr[1][0]);//报空指针的异常arr3[1] = new String[4];//记住String arr6[] = new String[4];//对比:一维数组也是正确的写法//3.获取数组的长度System.out.println(arr4.length);//3System.out.println(arr4[0].length);//3System.out.println(arr4[1].length);//4//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();}}
}
**⑤数组元素的默认初始化值**```javapackage com.atguigu.java;/*二维数组的使用规定:二维数组分为外层数组的元素,内层数组的元素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(数组为引用数据类型)内层元素的初始化值为:不能调用,否则报错(不存在,报空指针)⑥数组的内存解析:见ArrayTest3.java*/public class ArrayTest3 {public static void main(String[] args){int[][] arr = new int[4][3];System.out.println(arr[0]);//[I@15db9742System.out.println(arr[0][0]);//0//System.out.println(arr);//[[I@6d06d69cSystem.out.println("*************");float[][] arr1 = new float[4][3];System.out.println(arr1[0]);//地址值System.out.println(arr1[0][0]);//0.0System.out.println("*************");String[][] arr2 = new String[4][3];System.out.println(arr2[0]);//地址值System.out.println(arr2[0][0]);//nullSystem.out.println("*************");double[][] arr3 = new double[4][];//数组是引用类型,二维数组里的第一维数组元素,即引用类型//引用类型默认nullSystem.out.println(arr3[1]);//null//System.out.println(arr3[1][0]);//报错}}
⑥数组的内存解析
第一行代码:arr1[0]为null引用数据类型不赋值,默认为null
四、每日复习
- 写出一维数组的初始化的两种方式
int[] arr = new int[5];//动态初始化String[] arr1 = new String[]{"Tom","Jerry"};
数组一旦初始化,其长度就是确定的。arr.length
数组长度一旦确定,就不可修改
- 写出二维数组初始化的两种方式 ```java int[][] arr = new int[4][3];//动态初始化1 int[][] arr1 = new int[4][];//动态初始化2
int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};//静态初始化
3.如何遍历如下的二维数组```javaint[][] arr = new int[][]{{1,2,3},{4,5,6}};//静态初始化for(int i = 0;i < arr.length;i++){for(int j = 0;j < arr[i].length;j++){System.out.print(arr[i][j] + "\t");}System.out.println();}
- 不同类型的一维数组元素的默认初始化值各是多少
整型 :0浮点型 :0.0char :0boolean:false引用类型:null
- 内存解析
五 练习
- 练习1
声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:a ) x[0] = y; nob) y[0] = x; yesc) y[0][0] = x; nod) x[0][0] = y; noe) y[0][0] = x[0]; yesf) x = y; no提示:一维数组:int[] x 或者int x[]二维数组:int[][] y 或者 int[] y[] 或者 int y[][]
- 练习2
package com.atguigu.exer;/*使用二维数组打印一个 10 行杨辉三角。 【提示】1. 第一行有 1 个元素, 第 n 行有 n 个元素2. 每一行的第一个元素和最后一个元素都是 13. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];*/public class YangHuiTest {public static void main(String[] args) {//1.声明并初始化二维数组int[][] yangHui = new int[10][];//2.给数组的元素赋值for(int i = 0;i < yangHui.length;i++){yangHui[i] = new int[i+1];//给首末元素赋值yangHui[i][0] = 1;yangHui[i][i] = 1;//给每行非首末元素赋值if(i > 1){for(int j =1;j < yangHui[i].length - 1;j++){yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];}}}//遍历二维数组for(int i = 0;i < yangHui.length;i++){for(int j = 0;j < yangHui[i].length;j++){System.out.print(yangHui[i][j] + " ");}System.out.println();}}}
