一、数组的概述

  1. 数组的理解:数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  2. 数组的相关概念:

    • 数组名
    • 元素
    • 角标,下标,索引
    • 数组的长度:元素的个数
  3. 数组的特点:

    • 数组是有序排列的
    • 数组属于引用数据类型的变量,数组的元素,既可以是基本数据类型,也可以是引用数据类型
    • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
    • 数组的长度一旦确定,就不能修改 (修改就要造一个新的)
    • new是从堆中开辟空间
  4. 数组的分类

    • 按照维数:一维数组、二维数组
    • 按照数组元素:基本数据类型元素的数组、引用数据类型元素的数组

二、一维数组的使用

    1. 一维数组的声明和初始化
    1. 如何调用数组的指定位置的元素(数组元素引用)
    1. 如何获取数组的长度
    1. 如何遍历数组
    1. 数组元素的默认初始化值
    1. 数组的内存解析

2.1 一维数组的声明和初始化

  • 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
  1. int[] arr = new int[3];
  2. arr[0] = 3;
  3. arr[1] = 9;
  4. arr[2] = 8;
  5. String names[];
  6. names = new String[3];
  7. names[0] = “钱学森”;
  8. names[1] = “邓稼先”;
  9. names[2] = “袁隆平”;
  • 静态初始化:在定义数组的同时就为数组元素分配空间并赋值
  1. int arr[] = new int[]{ 3, 9, 8};
  2. int[] arr = {3,9,8};//类型推断
  3. 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的长
    度(元素个数) ,数组一旦初始化,其长度是不可变的
  1. package com.atguigu.java;
  2. public class ArrayTest {
  3. public static void main(String[] args){
  4. //1.一维数组的声明和初始化
  5. int num;//声明
  6. num = 10;//初始化
  7. int id = 1001;//声明 + 初始化
  8. int[] ids;//声明
  9. //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行
  10. ids = new int[]{1001,1002,1003};
  11. int[] arr = {3,9,8};//类型推断
  12. String names[] = {"AA","BB","CC"};//类型推断
  13. //1.2 动态初始化:数组的初始化和数组元素的赋值操作分开进行
  14. String[] names = new String[5];
  15. //错误的写法
  16. // int[] arr1 = new int[];//后边没写
  17. // int[] arr3 = new int[3]{1,2,3};//不能加3
  18. //总结:数组一旦初始化完成,其长度就确定了。
  19. //2.如何调用数组指定位置的元素:通过索引的方式
  20. //数组的角标(或索引)从0开始的,到数组长度-1结束
  21. names[0] = "战国0";
  22. names[1] = "春秋1";
  23. names[2] = "隋唐2";
  24. names[3] = "大宋3";
  25. names[4] = "明清4";
  26. //names[5] = "4";//数组下标越界
  27. //3.如何获取数组的长度。
  28. //属性:length
  29. System.out.println(names.length);
  30. System.out.println(ids.length);
  31. //4.如何遍历数组
  32. //快捷注释ctrl+shift+斜杆
  33. //解除快捷注释ctrl+shift+反斜杆
  34. /*System.out.println(names[0]);
  35. System.out.println(names[0]);
  36. System.out.println(names[0]);
  37. System.out.println(names[0]);
  38. System.out.println(names[0]);*/
  39. for(int i = 0;i < names.length;i++){
  40. System.out.println(names[i]);
  41. }
  42. }
  43. }

2.5 数组元素的默认初始值

  • 对于基本数据类型而言,默认初始化值各有不同

    • 数组元素是整型:0
    • 数组元素是浮点型:0.0
    • 数组元素是char型:0或’\u0000’,而非’0’
    • 数组元素是boolean型:false
  • 对于引用数据类型而言,默认初始化值为null(注意与0不同!)
  1. package com.atguigu.java;
  2. /*
  3. * 5.数组元素的默认初始值
  4. * byte short int long
  5. * >数组元素是整型:0
  6. * >数组元素是浮点型:0.0
  7. * >数组元素是char型:0或'\u0000',而非'0'
  8. * >数组元素是boolean型:false true
  9. * >数组元素时引用数据类型:null
  10. */
  11. public class ArrayTest1 {
  12. public static void main(String[] args){
  13. //5.数组元素的默认初始化值
  14. int[] arr = new int[4];//动态
  15. for(int i = 0;i < arr.length;i++){
  16. System.out.println(arr[i]);
  17. }
  18. System.out.println("*****************");
  19. short[] arr1 = new short[4];
  20. for(int i = 0;i < arr.length;i++){
  21. System.out.println(arr[i]);
  22. }
  23. System.out.println("*****************");
  24. float[] arr2 = new float[5];
  25. for(int i = 0;i < arr2.length;i++){
  26. System.out.println(arr2[i]);
  27. }//float默认类型为0.0
  28. System.out.println("*****************");
  29. char[] arr3 = new char[4];
  30. for(int i =0;i < arr3.length; i++){
  31. System.out.println("-----" + arr3[i] + "-----");
  32. }//char默认为0
  33. if(arr[3] == 0){
  34. System.out.println("char默认类型为0");
  35. }
  36. System.out.println("*************");
  37. boolean[] arr4 =new boolean[5];//用动态初始化去测
  38. System.out.println(arr4[0]);//boolean默认为false
  39. System.out.println("*************");
  40. String[] arr5 = new String[5];
  41. System.out.println(arr5[0]);//String默认为null
  42. if(arr5[0] == null){
  43. System.out.println("String默认为null");
  44. }
  45. }
  46. }

2.6 数组的内存解析

2.6.1 内存简化结构

2.6.2 一维数组的内存解析
  • 放在方法中的变量都叫做局部变量
  • 第一行代码new出来的放在堆中

    • 首地址值0x34ab赋值给arr
  • 第二行代码new出来的放在堆中(new出来的结构在堆中重新开辟空间)
  • 第三行代码进行赋值
  • 第四行代码:看到new,重新开辟空间

2.7 一维数组的使用:练习题

2.7.1 一维数组课后练习题1

升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。

  1. package com.atguigu.exer;
  2. public class ArrayDemo {
  3. public static void main(String[] args) {
  4. int[] arr = new int[]{8,2,1,0,3};
  5. int[] index = new int[]{2,0,3,2,4,0,1,3,2,3,3};
  6. String tel = "";
  7. for(int i = 0;i < index.length;i++){
  8. tel += arr[index[i]];
  9. }
  10. System.out.println("联系方式:" + tel);//18..
  11. }
  12. }

2.7.2 一维数组课后练习题2

CTRL+SHIFT+回车:上面一行

SHIFT+回车:下面一行

  1. package com.atguigu.exer;
  2. /*从键盘读入学生成绩,找出最高分,
  3. 并输出学生成绩等级。
  4. 成绩>=最高分-10 等级为’A’
  5. 成绩>=最高分-20 等级为’B’
  6. 成绩>=最高分-30 等级为’C’
  7. 其余 等级为’D’
  8. 提示:先读入学生人数,根据人数创建int数组,
  9. 存放学生成绩。*/
  10. import java.util.Scanner;
  11. class ArrayDemo1 {
  12. public static void main(String[] args) {
  13. //1.使用Scanner,读取学生个数
  14. Scanner scanner = new Scanner(System.in);
  15. System.out.print("请输入数组元素个数");
  16. int n = scanner.nextInt();
  17. //创建数组,存储学生成绩,
  18. int[] score = new int[n];//动态初始化
  19. //给数组赋值
  20. for(int i = 0;i < n;i++){
  21. System.out.print("请输入数组元素(整型)");
  22. score[i] = scanner.nextInt();
  23. }
  24. System.out.print("输出数组元素(整型)");
  25. for(int i = 0;i < n;i++){
  26. System.out.print(score[i]);
  27. }
  28. for(int i = 0;i < n-1;i++){//n-1趟
  29. for(int j = 0; j < n - 1 - i;j++){//如果n为4,第一趟比较为3次
  30. if(score[j] > score[j + 1]){
  31. int temp = score[j];
  32. score[j] = score[j + 1];
  33. score[j + 1] = temp;
  34. }
  35. }
  36. }
  37. System.out.print("输出排序后的数组元素(整型)");
  38. for(int i = 0;i < n;i++){
  39. System.out.println(score[i]);
  40. }
  41. int max = score[n-1];
  42. System.out.print("最高分为" + max);
  43. char level;
  44. for(int i = 0;i < score.length;i++ ){
  45. if(max - score[i] <= 10){
  46. level = 'A';
  47. }else if(max - score[i] <= 20){
  48. level = 'B';
  49. }else if(max - score[i] <= 30){
  50. level = 'C';
  51. }else{
  52. level = 'D';
  53. }
  54. System.out.println("student " + i +
  55. "score is" + score[i] + ",grade is " + level);
  56. }
  57. }
  58. }

三、二维数组的使用

3.1 理解

对于二维数组的理解,可以看成一维数组array1又作为另一个一维数组array2得元素而存在。其实,从数组底层得运作机制来看,没有多维数组

引用类型就两种情况:要么null(没赋值),要么地址值

3.2 二维数组的使用

  • ①二维数组的声明和初始化

  • ②如何调用数组的指定位置的元素

  • ③如何获取数组的长度

  • ④如何遍历数组

  • ⑤数组元素的默认初始化值

  • ⑥数组的内存解析

    • 1、2、3、4 ```java package com.atguigu.java;

public class ArrayTest2 {

  1. public static void main(String[] args) {
  2. //1.二维数组的声明和初始化
  3. int[] arr = new int[]{1,2,3};//一维数组
  4. //二维数组静态初始化
  5. int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
  6. //动态初始化1
  7. String[][] arr2 = new String[3][2];//arr1[0][0]默认为0
  8. //动态初始化2
  9. String[][] arr3 = new String[3][];
  10. //错误的情况
  11. //String[][] arr4 = new String[][4];
  12. //int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7}};
  13. //也是正确的写法
  14. int arr4[][] = new int[][]{{1,2,3},{4,5,6,8},{6,7,8}};//[][]放后面
  15. int arr5[][] = {{1,2,3},{4,5},{6,7,8}};//类型推断
  16. //2.如何调用数组的指定位置元素
  17. System.out.println(arr1[0][1]);//2
  18. System.out.println(arr2[1][1]);//默认null
  19. //System.out.println(arr[1][0]);//报空指针的异常
  20. arr3[1] = new String[4];//记住
  21. String arr6[] = new String[4];//对比:一维数组也是正确的写法
  22. //3.获取数组的长度
  23. System.out.println(arr4.length);//3
  24. System.out.println(arr4[0].length);//3
  25. System.out.println(arr4[1].length);//4
  26. //4.如何遍历二维数组
  27. for(int i = 0;i < arr4.length;i++){
  28. for(int j = 0; j < arr4[i].length;j++){
  29. System.out.print(arr4[i][j] + " ");
  30. }
  31. System.out.println();
  32. }
  33. }

}

  1. **⑤数组元素的默认初始化值**```java
  2. package com.atguigu.java;
  3. /*
  4. 二维数组的使用
  5. 规定:二维数组分为外层数组的元素,内层数组的元素
  6. int[][] arr = new int[4][3];
  7. 外层元素:arr[0],arr[1]等
  8. 内层元素:arr[0][0],arr[1][2]等
  9. ⑤数组元素的默认初始化值:
  10. 针对于初始化方式一:比如:int[][] arr = new int[4][3];
  11. 外层元素的初始化值为:地址值
  12. 内层元素的初始化值为:与一维数组初始化情况相同
  13. 针对初始化方式二:比如:int[][] arr = new int[4][];
  14. 外层元素的初始化值为:null(数组为引用数据类型)
  15. 内层元素的初始化值为:不能调用,否则报错(不存在,报空指针)
  16. ⑥数组的内存解析:见ArrayTest3.java
  17. */
  18. public class ArrayTest3 {
  19. public static void main(String[] args){
  20. int[][] arr = new int[4][3];
  21. System.out.println(arr[0]);//[I@15db9742
  22. System.out.println(arr[0][0]);//0
  23. //System.out.println(arr);//[[I@6d06d69c
  24. System.out.println("*************");
  25. float[][] arr1 = new float[4][3];
  26. System.out.println(arr1[0]);//地址值
  27. System.out.println(arr1[0][0]);//0.0
  28. System.out.println("*************");
  29. String[][] arr2 = new String[4][3];
  30. System.out.println(arr2[0]);//地址值
  31. System.out.println(arr2[0][0]);//null
  32. System.out.println("*************");
  33. double[][] arr3 = new double[4][];
  34. //数组是引用类型,二维数组里的第一维数组元素,即引用类型
  35. //引用类型默认null
  36. System.out.println(arr3[1]);//null
  37. //System.out.println(arr3[1][0]);//报错
  38. }
  39. }

⑥数组的内存解析

第一行代码:arr1[0]为null引用数据类型不赋值,默认为null

四、每日复习

  1. 写出一维数组的初始化的两种方式
    1. int[] arr = new int[5];//动态初始化
    2. String[] arr1 = new String[]{"Tom","Jerry"};


数组一旦初始化,其长度就是确定的。arr.length
数组长度一旦确定,就不可修改

  1. 写出二维数组初始化的两种方式 ```java int[][] arr = new int[4][3];//动态初始化1 int[][] arr1 = new int[4][];//动态初始化2

int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};//静态初始化

  1. 3.
  2. 如何遍历如下的二维数组
  3. ```java
  4. int[][] arr = new int[][]{{1,2,3},{4,5,6}};//静态初始化
  5. for(int i = 0;i < arr.length;i++){
  6. for(int j = 0;j < arr[i].length;j++){
  7. System.out.print(arr[i][j] + "\t");
  8. }
  9. System.out.println();
  10. }
  1. 不同类型的一维数组元素的默认初始化值各是多少
    1. 整型 :0
    2. 浮点型 :0.0
    3. char :0
    4. boolean:false
    5. 引用类型:null
  1. 内存解析

五 练习

  1. 练习1
  1. 声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:
  2. a ) x[0] = y; no
  3. b) y[0] = x; yes
  4. c) y[0][0] = x; no
  5. d) x[0][0] = y; no
  6. e) y[0][0] = x[0]; yes
  7. f) x = y; no
  8. 提示:
  9. 一维数组:int[] x 或者int x[]
  10. 二维数组:int[][] y 或者 int[] y[] 或者 int y[][]
  1. 练习2
  1. package com.atguigu.exer;
  2. /*使用二维数组打印一个 10 行杨辉三角。 【提示】
  3. 1. 第一行有 1 个元素, 第 n 行有 n 个元素
  4. 2. 每一行的第一个元素和最后一个元素都是 1
  5. 3. 从第三行开始, 对于非第一个元素和最后一个元
  6. 素的元素。即:
  7. yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
  8. */
  9. public class YangHuiTest {
  10. public static void main(String[] args) {
  11. //1.声明并初始化二维数组
  12. int[][] yangHui = new int[10][];
  13. //2.给数组的元素赋值
  14. for(int i = 0;i < yangHui.length;i++){
  15. yangHui[i] = new int[i+1];
  16. //给首末元素赋值
  17. yangHui[i][0] = 1;
  18. yangHui[i][i] = 1;
  19. //给每行非首末元素赋值
  20. if(i > 1){
  21. for(int j =1;j < yangHui[i].length - 1;j++){
  22. yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
  23. }
  24. }
  25. }
  26. //遍历二维数组
  27. for(int i = 0;i < yangHui.length;i++){
  28. for(int j = 0;j < yangHui[i].length;j++){
  29. System.out.print(yangHui[i][j] + " ");
  30. }
  31. System.out.println();
  32. }
  33. }
  34. }