第五讲

Java语言基础第五讲

一.数组概述和定义格式说明

  • 为什么要有数组(容器)—-为了储存同种数据类型的多个值.
  • 数组的概念
    • 数组是储存同一种数据类型的多个元素的集合,也可以看成是一个容器;
    • 数组可以存储基本数据类型,也可以存储引用数据类型.
  • 数组定义的格式

    • 数据类型[] 数组名 = new 数据类型 [数组的长度];

      class Demo1_Array {     //Array数组
          public static void main(String[] args) {
              int x = 10;
              x = 20;             //输出结果是20,10会被覆盖掉.
              System.out.println("x = " + x);
      
          //定义数组
              int[] arr = new int [5];        //可以存储5个int类型的数据
      
          /*
          数组中的各项解释:
          左边:
          int: 数据类型
          []:代表的是数组,有几个中括号就代表几维数组;
          arr: 数组名,合法的标识符就可以;
      
          右边:
          new:创建新的实体或对象;
          int:数据类型;
          []:代表数组;
          5:代表数组中存储的数组长度.
          */
          }
      }
      

二.数组的初始化动态初始化

  • 什么是数组的初始化
    • 就是为数组开辟连续的内存空间,并为每个数组元素赋予值.
  • 如何对数组进行初始化
    • 动态初始化,只指定长度,有系统给定初始值;
    • 静态初始化,给定初始值,有系统指定长度.
  • 动态初始化的格式:
    • 数据类型[] 数组名 = new 数据类型 [数组长度];
    • int[ ] arr = new int [5];
  • 练习输出数组名称和数组元素.

    class Demo2_Array {
        public static void main(String[] args) {
    
            int[] arr = new int [5];            //动态初始化,在内存中开辟连续的五块空间
    
            System.out.println(arr[0]);         //系统给出的默认初始化值,整数类型的都是0.
            arr[0] = 10;
            System.out.println(arr[0]); 
            arr[0] = 20;
            System.out.println(arr[0]); 
    
            /*整数类型:byte,shoot,int,long,默认初始值都是0;
              浮点类型:double,float默认初始化值都是0.0;
              布尔类型:boolean默认初始化值都是false;
              字符类型:char默认初始化值都是'\u0000'(转移四个0)
                char在内存中占两个字节,是16个二进制位. */  
    
            System.out.println(arr);            //输出结果是[I@16925b0
    
            /*[I@16925b0 各项解释:
            [ 代表的是数组,几个就代表几维;
            I 代表int数据类型;
            @ 是固定的;
            16925b0 代表的是16进制的地址名 */
        }
    }
    

三.java中内存分配以及栈和堆的区别


    • 存储局部变量
      • 局部变量:定义在方法声明上或方法中的变量

    • 存储new出来的数组或对象
  • 方法区(了解)
    • 面向对象部分讲解
  • 本地方法区(了解)
    • 和系统有关
  • 寄存器(了解)
    • 给CPU使用
  • 练习一个数组

    class Demo3_Array {
        public static void main(String[] args) {
            int[] arr = new int[3];     //动态初始化,创建三个连续的空间.
    
        System.out.println(arr);
        arr[0] = 10;
        arr[1] = 20;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        }
    }
    
  • 练习两个数组

    //两个数组,三个引用
    
    class Demo4_Array {
        public static void main(String[] args) {
            int[] arr = new int[3];     //动态初始化,创建三个连续的空间.
            int[] arr1 = new int[5];    //创建数组,长度为3.
            int[] arr2 = arr1;          //地址名相同,两个引用指向同一个数组实体
    
        System.out.println(arr);
        System.out.println(arr1);
        System.out.println(arr2);
    
        arr[0] = 10;
        arr[1] = 20;
        arr1[1] = 30;
        arr2[1] = 40;
        arr2[1] = 50;
    
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    
        System.out.println("---------");
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);
        System.out.println(arr1[2]);
        System.out.println(arr1[3]);
        System.out.println(arr1[4]);
    
        System.out.println("---------");
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
        System.out.println(arr2[3]);
        System.out.println(arr2[4]);
        }
    }
    

四.数组的初始化静态初始化

  • 静态初始化的格式
    • 数据类型[] 数组名 = 数据类型 new [] {元素1,元素2,…};
  • 简写格式
    • 数据类型[] 数组名 = {元素1,元素2,…};
  • 两种格式的区别

    • 标准格式声明和赋值可以不在同一行;
    • 而简写格式声明和赋值必须在同一行.

      class Demo5_Array {
          public static void main(String[] args) {
              //标准格式:
              int[] arr;
              arr = new int[] {11,22,33,44,55};               //可以分行写
              //int[] arr = new int[5] {11,22,33,44,55};      //不可以动静结合
              //简化格式:
              int[] arr1 = {11,22,33,44,55};                  //声明和赋值必须在同一行
      
              System.out.println(arr);        //打印数组名
              System.out.println(arr1[0]);
              System.out.println(arr[2]);
          }
      } 
      
  • 数组操作的两个常见小问题
    • ArrayIndexOutOfBoundsException:数组引索越界异常
      • 原因:访问了不存在的引索
    • NullPointerException:空指针异常
      • 原因:数组已经不在指向堆内存了,而你还用数组名去访问元素
      • int[] arr = {11,22,33};
      • arr = null;
      • System.out.println(arr[0]);
  • 错误演示

    class Demo_Exception {      //Exception异常
        public static void main(String[] args) {
            int[] arr = new int [5]; 
            System.out.println(arr[5]);     //当访问数组中不存在的索引时,会出现索引越界异常
    
            arr = null;
            System.out.println(arr[0]);     //当赋值引用为null时,在去调用数组中的元素,会出现空指针异常
        }
    }
    
  • 数组的操作–遍历

    • 数组遍历: 就是一次输出数组中的每一个元素;
    • 数组的属性: arr.length 数组的长度;
    • i <= arr.length 时出现的错误
      • Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException:
    • 数组的最大引索:arr.length -1;

      class Demo7_Array {
          public static void main(String[] args) {
              int[] arr = {11,22,33,44};
      
              for (int i = 0;i < arr.length ;i++ ) {
                  System.out.println(arr[i]);
      
              }
                  System.out.println("-------");
      
          //用方法来编译数组遍历
          int[] arr2 = {1,2,3};
          print(arr2);
          }
          /*
          数组的遍历
          1.明确返回值类型 void
          2.明确参数列表 int[] arr 
          */
      
          public static void print(int[] arr2){
              for (int i = 0;i < arr2.length ;i++ ) {
                  System.out.println(arr2[i]);
              }
          }
      }
      
  • 数组相关练习
    • 数组或最值(获取数组中的最大最小值)

——数组或最值(获取数组中的最大最小值)

//获取最大值(最小值是将if条件语句中的 < 改为 > ,让max每次记住较小的值)
class Demo8_Array {
    public static void main(String[] args) {
        int [] arr = {10,20,30,40,50};
        int max = getMax(arr);
        System.out.println(max);
    }

    /*
    返回值类型 int
    参数列表int[] arr
    */
    public static int getMax(int[] arr){
        int max = arr[0];                           
        for (int i = 1;i < arr.length ;i++ ) {      //从数组的第二个元素开始遍历
            if (max < arr[i]) {                     //如果max记录的值小于数组中的元素
                max = arr[i];                       //max记录住较大的值
            }
        }
    return max;
    }
}

* 数组元素反转(就是把元素对调)

—-数组元素反转(就是把元素对调)

class Demo9_Array {
    public static void main(String[] args) {
        int[] arr = {10,20,30,40,50};
        reverseArray(arr);
        print(arr);
        }
        /*数组元素反转
        1.返回值类型void
        2.参数列表int[] arr */

    public static void reverseArray(int[] arr) {
        for (int i = 0;i < arr.length / 2 ;i++ ) {

        //arr[0]和arr[arr.length-1-0]交换
        //arr[1]和arr[arr.length-1-1]交换
        //arr[2]和arr[arr.length-1-2]交换
        int temp = arr[i];                      //将数组进行反转
        arr[i] = arr [arr.length-1-i];
        arr [arr.length-1-i] = temp;
        }
    }
        /*
        数组遍历
        1.返回值类型void
        2.参数列表int[] arr
        */

    public static void print(int[] arr) {           //遍历数组中的每一个元素
        for (int i = 0;i < arr.length ;i++ ) {
            System.out.print(arr[i] + " ");
        }
    }
}

* 数组查表法(根据键盘录入索引,查找对应星期)

—-数组查表法(根据键盘录入索引,查找对应星期)

import java.util.Scanner;
class Demo10_Array  {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个整数,范围在1--7之间");
    int x = sc.nextInt();
        System.out.println("对应的星期是" + getWeek(x));
    }
    /*根据索引查找对应星期
    1.返回值类型char,(char类型可以存储中文字)
    2.参数列表int week
    */
    public static char getWeek(int week) {
        char[] arr = {' ','一','二','三','四','五','六','日'};     //定义了一张星期表
        return arr[week];
    }
}


//数组的冒泡排序
class Demo_ArrayTest {
    public static void main(String[] args) {
        int[] arr = {5,3,4,9,7};
        System.out.print("冒泡排序前: ");
        print(arr);
        print2(arr);
        System.out.print("冒泡排序后: ");
        print(arr);
    }
    //数组的遍历
    public static void print(int[] arr) {
        for (int i = 0;i < arr.length ;i++ ) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    //定义对数组排序的方法,利用for语句的嵌套循环
    public static void print2(int[] arr) {
        for (int i = 0;i < arr.length - 1;i++ ) {
            for (int j = 0;j < arr.length - i - 1 ;j++ ) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.print("第" + (i + 1) + "轮排序后:");
            print(arr);
        }
    }
}

* 数组元素查找(查找指定元素第一次在数组中出现的索引)

—-数组元素查找(查找指定元素第一次在数组中出现的索引)

class Demo11_Array {
    public static void main(String[] args) {
        int[] arr= {10,20,30,40,50,60};
        int index = getIndex(arr,60);
        System.out.println(index);
    }

    /*查找元素索引
    1.返回值类型int
    2.参数列表int[] arr,int value
    */
    public static int getIndex(int[] arr,int value){
        for (int i = 0;i < arr.length ;i++ ) {          //数组的遍历
            if (value == arr[i]) {                      //如果数组中的元素和查找中的匹配
                return i;
            }
        }
        return -1;
    }
}

五.二维数组的概述和格式

  • 二维数组的定义—-在一个数组中定义了另一个数组,一个数组包含另一个数组;
  • 二维数组的格式

    • 格式一: int arr [] [] = new int [3] [2];
      • 1.数据类型 数组名 [] [] = new 数据类型 [m] [n];
      • 2.数据类型 [] 数组名 [] = new 数据类型 [m] [n];
    • 格式二: int arr [] [] = new int [3] [];
    • 格式三: int arr [] [] = {{1,2,3},{4,5},{6,7,8,9}};
  • 定义二维数组,输出二维数组名称,一维数组名称,一个元素.

      class Demo22_Array {
        public static void main(String[] args) {
            int arr [][] = new int[3][2];
    
            /*
            这是一个二维数组
            这个二维数组中有3个一维数组
            每个一位数组中有2个元素
            */
    
            System.out.println(arr);            //二维数组
            System.out.println(arr[0]);         //一维数组
            System.out.println(arr[0][0]);      //二维数组的第一个一维数组的第一个元素
    
            /*输出结果
            [[I@297ffb      二维数组地址值
            [I@914f6a       一维数组地址值
            0               第一个一维数组的第一个元素
            */
        }
    }
    
  • 二维数组练习之遍历

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

      class test1_Array {
          public static void main(String[] args) {
          int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};        //这是一个二维数组,这个二维数组中每个大括号都代表一个一维数组
      
              for (int i = 0;i < arr.length ;i++ ) {          //获取到每个二维数组中的一维数组
                  for (int j = 0;j < arr[i].length ;j++ ) {       //获取每个一维数组中的元素
                      System.out.print(arr[i][j] + " ");
                  }
                  System.out.println();
              }
          }
      }
      
  • 二维数组练习之求和

    需求:公司年销售额求和
    某公司按照季度和月份统计的数据如下:单位(万元)
    第一季度:22,66,44
    第二季度:77,33,88
    第三季度:25,45,65
    第四季度:11,66,99
    
    class Test2_Array {
        public static void main(String[] args) {
            int arr [][] = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
    
            int sum = 0;                    //定义变量,记录每次相加的结果
            for (int i = 0;i < arr.length ;i++ ) {      //获取二维数组中的一维数组
                for (int j = 0;j < arr[i].length ;j++ ) {       //获取一维数组中的每一个元素
                    sum = sum + arr[i][j];              //累加求和  
                }
            }
            System.out.println(sum);
        }
    }
    
  • 思考题java中的参数传递问题.

    看程序写结果,并画内存图解释
    
    class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("a:"+a+",b:"+b);     //a=10,b=20
        change(a,b);
        System.out.println("a:"+a+",b:"+b);     //a=10.b=20
    
        int[] arr = {1,2,3,4,5};
        change(arr);
        System.out.println(arr[1]);             //arr[1]=4
    }
    
    public static void change(int a,int b) {
        System.out.println("a:"+a+",b:"+b);     //a=10,b=20
        a = b;                                  //a=20
        b = a + b;                              //b=40
        System.out.println("a:"+a+",b:"+b);     //a=20,b=40
    }
    
    public static void change(int[] arr) {
        for(int x=0; x<arr.length; x++) {
            if(arr[x]%2==0) {
                arr[x]*=2;              //数组中的元素变为{1,4,3,8,5}
            }
        }
    }
    
  • 结论:
    • 基本数据类型的值传递,不改变原值,因为调用后就会跳栈,局部变量也就随之消失了;
    • 引用数据类型的值传递,会改变原值,因为即使是方法跳栈,堆内存数组对象还在,还是可以通过地址访问到的.
  • 面试题
  • java中到底传值还是传址?
    • 即是传值也是传址,基本数据类型传递的是值,引用数据类型传递的是址;
    • java中只有传值,因为地址值也是值(以后面试就说这种,因为这是高司令(java之父:詹姆斯.高斯林)支持的).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值