Java基础3—{数组(一维数组、二维数组)、递归}

1.一维数组

1.1 数组概述和定义格式

  • 1:数组概念

    数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
    数组既可以存储基本数据类型,也可以存储引用数据类型(后面讲解)。

  • 2:数组定义格式

    格式1: 数据类型[] 数组名;
    格式2: 数据类型 数组名[];
  举例:
    int[] a; 定义了一个int类型的数组a;
    int a[]; 定义了一个int类型的a数组;
    推荐使用第一种定义方式。

1.2 数组的初始化

  • 1:什么是数组的初始化

    Java中的数组必须先初始化,然后才能使用。
    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

  • 2:初始化的分类:

    a:动态初始化: 只指定长度,由系统给出初始化值
    b:静态初始化: 给出初始化值,由系统决定长度
  注意事项: 这两种方式,只能使用一种,不能进行动静结合

  • 3:动态初始化的格式:

    数据类型[] 数组名 = new 数据类型[数组长度];
    数组长度其实就是数组中元素的个数。
    举例: int[] arr = new int[3]; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值。

  • 4:静态初始化格式:

    格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
    举例: int[] arr = new int[]{1,2,3};
    简化格式:
    数据类型[] 数组名 = {元素1,元素2,…};
    举例: int[] arr = {1,2,3};

1.3 Java中内存分配以及栈堆理解

  • 1:栈: 存放的是局部变量

    局部变量:在方法定义中或者方法声明上的变量都是局部变量。

  • 2:堆: 存放的是所有new出来的东西

    特点:
    a: 每一个new出来的东西都会为其分配一个地制值。
    b: 每一个变量都有一个默认的值
    byte,short,int,long -- 0
    float,double -- 0.0
    char -- '\u0000'
    boolean -- false
    引用数据类型 -- null
    c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收

  • 3:方法区:(面向对象部分讲解)
  • 4:本地方法区:(和系统相关)
  • 5:寄存器:(cpu使用)

1.4 数组内存图解

  • 1:一个数组的内存图解

  •  2:二个数组的内存图解

1.5数组操作的两个常见异常

  • 1:ArrayIndexOutOfBoundsException:数组索引越界异常

   原因:你访问了不存在的索引。

  • 2:NullPointerException:空指针异常

   原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。

1.6一维数组案例演示

  •   1:数组遍历:就是依次输出数组中的每一个元素。
1 /数组遍历:就是依次输出数组中的每一个元素。
2 public class Demo01 {
3     public static void main(String[] args) {
4         int [] arr={12,52,36,65,21};
5         for (int i = 0; i < arr.length; i++) {
6             System.out.print(arr[i]+"\t");
7         }
8     }
9 }
  • 2:数组获取最值(获取数组中的最大值或者最小值)
 1 //数组获取最值(获取数组中的最大值或者最小值)
 2 public class Demo02 {
 3     public static void main(String[] args) {
 4         int [] arr={12,52,36,65,21};
 5         int max=0;
 6         for (int i = 0; i < arr.length; i++) {
 7             if(arr[i]>=max){
 8                 max=arr[i];
 9             }
10         }
11         System.out.println("最大值是"+max);
12     }
13 }
  • 3:数组元素查找(查找52第一次在数组中出现的索引)
 1 //数组元素查找(查找52第一次在数组中出现的索引)
 2 public class Demo03 {
 3     public static void main(String[] args) {
 4         int [] arr={12,52,36,65,21,52};
 5         for (int i = 0; i < arr.length; i++) {
 6             if(arr[i]==52){
 7                 System.out.println("52在数组中第一次出现的索引为"+i);
 8                 break;
 9             }
10         }
11     }
12 }

2.二维数组

2.1 二维数组的概述和格式

  • 1:二维数组概述

    二维数组其实就是每一个元素为一维数组的数组。

  • 2:二维数组格式1

    数据类型[][] 变量名 = new 数据类型[m][n];
    m表示这个二维数组有多少个一维数组 必须写上
    n表示每一个一维数组的元素个数 可选
  举例:
    int[][] arr = new int[3][2];
    定义了一个二维数组arr
    这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
    每个一维数组有2个元素,可以通过arr[m][n]来获取
    表示获取第m+1个一维数组的第n+1个元素

  • 3:注意事项

   A:以下格式也可以表示二维数组
    a:数据类型 数组名[][] = new 数据类型[m][n];
     b:数据类型[] 数组名[] = new 数据类型[m][n];

    这两种格式不推荐使用
  B:注意下面定义的区别
    int x,y;
    int[] x,y[];
  区别是:
    int[] x,y[];//定义了两个数组 一个是一维数组x 一个是二维数组y
    x=new int[3];
    y=new int[3][];

  • 4:二维数组格式2

    数据类型[][] 变量名 = new 数据类型[m][];
    m表示这个二维数组有多少个一维数组
    这一次没有直接给出一维数组的元素个数,可以动态的给出。
  举例:
    int[][] arr = new int[3][];
    arr[0] = new int[2];
    arr[1] = new int[3];
    arr[2] = new int[1];

  • 5:二维数组格式3

    数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}...};
  简化版:
    数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
    这个格式属于静态初始化:由我们指定具体的元素值,由系统给分配长度
  举例:
    int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
    int[][] arr = {{1,2,3},{5,6},{7}};

2.2 二维数组的内存图

2.2 二维数组案例演示

  • 1:需求:二维数组遍历

    外循环控制的是二维数组的长度,其实就是一维数组的个数。
    内循环控制的是一维数组的长度。

 1 //二维数组遍历
 2 public class Demo04 {
 3     public static void main(String[] args) {
 4         int [][] arr={{48,5,1},{52,1,6,5},{4,8,9,2}};
 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         }
10     }
11 }
  • 2:案例演示

    需求:公司年销售额求和
    某公司按照季度和月份统计的数据如下:单位(万元)
    第一季度:22,66,44
    第二季度:77,33,88
    第三季度:25,45,65
    第四季度:11,66,99

 1 public class Demo05 {
 2     public static void main(String[] args) {
 3         int [][] arr={{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
 4         int sum=0;
 5         for (int i = 0; i < arr.length; i++) {
 6             for (int j = 0; j < arr[i].length; j++) {
 7                 sum+=arr[i][j];
 8             }
 9         }
10         System.out.println("公司年销售额总和为"+sum);
11     }
12 }
  • 3:需求:打印杨辉三角形(行数可以键盘录入)

    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1

  分析:看这种图像的规律
  A:任何一行的第一列和最后一列都是1
  B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。

 1 //打印杨辉三角
 2 //任何一行的第一列和最后一列都是1
 3 //从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
 4 public class Demo06 {
 5     public static void main(String[] args) {
 6         Scanner sc = new Scanner(System.in);
 7         System.out.println("请输入行数");
 8         int n = sc.nextInt();
 9         int [][] arr=new int[n][n];
10         for (int i = 0; i < n; i++) {
11             arr[i][0]=1;
12             arr[i][i]=1;
13         }
14         for (int i = 2; i < n; i++) {
15             for(int j=1;j<i;j++){
16                 arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
17             }
18         }
19         for (int i = 0; i < n; i++) {
20             for(int j=0;j<=i;j++){
21                 System.out.print(arr[i][j]+"\t");
22             }
23             System.out.println();
24         }
25     }
26 }

3.递归

3.1 递归概述

  • 1:递归概述: 方法定义中调用方法本身的现象
  • 2:递归注意事项

    要有出口,否则就是死递归
    次数不能太多,否则就内存溢出

3.2 递归案例演示

  • 1:需求:求5的阶乘,用递归实现
 1 public class Demo07 {
 2     public static void main(String[] args) {
 3         int i=5;
 4         int sum = jieCheng(i);
 5         System.out.println(sum);
 6     }
 7     public static int jieCheng(int n){
 8         if(n==1){
 9             return 1;
10         }else{
11             return n*jieCheng(n-1);
12         }
13     }
14 }

 

猜你喜欢

转载自www.cnblogs.com/wanyan1234/p/12016093.html
今日推荐