Day05

作者: 拼搏男孩 | 来源:发表于2019-11-25 17:54 被阅读0次

一. 数组

  1. 数组

    • 组就是指多个的意思 , 在之前我们的代码中使用的数据类型都是单个的 , 为了将多个相同类型的数据存储在一起 , 这时候就引出了组的概念
    • 数组是存储同一种数据类型多个元素的集合, 也可以看成是一个容器
    • 数组可以存储基本数据类型,也可以存储引用数据类型
    • 数组是java中的唯一底层容器
  2. 数组的初始化

    • 就是为数组开辟连续的内存空间, 并为每个数组元素赋值

    • 静态初始化

      • 指定内容,数组的长度由jvm自动判断
      • 数据类型[] 数组名 = new 数据类型[ ]{元素,元素,元素,元素,元素}
      • 数据类型[] 数组名 = {元素,元素,元素,元素,元素}
    • 动态初始化

      • 指定数组的长度, 数组中的元素由jvm给出默认值
      • 数组类型[] 数组名 = new 数据类型[数组长度]
      public static void main(String[] args) {
         //静态初始化
         int[] arr = {5,6,7,2,1};
         
         //动态初始化
         int[] arr2 = new int[5];
      }
      
  1. 注意事项

    • 数组的长度在创建的时候就固定了, 中途无法被改变
    • 数组是靠角标定位元素,角标值从0开始
    • 数组属于引用数据类型
    • 数组中元素必须是同一种数据类型
  2. 数组的操作

    • 使用数组的角标对数组进行操作,我们可以将数组的一个角标位看作是一个变量
    • 获取数组的某个角标位 : arr[角标值]
      • 获取到数组中的某个角标之后, 就可以获取值和赋值了
    • 获取数组的长度(元素的个数) : arr.length
    public static void main(String[] args) {
     
     int[] arr = new int[5];
     //获取数组的0角标位
     int i = arr[0];
     //给数组的角标位赋值
     arr[0] = 4;
     
    }
    
  3. 数组默认值

    • 整数型 : byte short int long 默认初始化值都是0
    • 浮点型 : float double 默认初始化值都是0.0
    • 布尔型 : boolean 默认初始化值是false
    • 字符型 : char 默认初始化值是 '\u0000' 十六进制的
    • 引用数据类型 : 所有引用数据类型的初始化值都是null
    public static void main(String[] args) {
     //整数型 默认值是0
     int[] is = new int[2];
     System.out.println(is[0]);
     //字符型 默认是值十六进制的 '\u0000'
     char[] chs = new char[2];
     System.out.println(chs[0]);
     //浮点型 默认值是0.0
     double[] ds = new double[2];
     System.out.println(ds[0]);
     //布尔型 默认值是false
     boolean[] bs = new boolean[2];
     System.out.println(bs[0]);
     //引用数据类型默认值是null
     String[] strs = new String[2];
     System.out.println(strs[0]);
     
    }
    

二. 内存图

  1. java中内存分配
    • 栈 : 存储局部变量
    • 堆 : 存储new出来的数组或对象
    • 方法区 : 面向对象部分讲解
    • 本地方法区 : 和系统相关的方法
  2. 数组动静态初始化步骤
    • 动态初始化
      • 开辟连续的内存空间
      • 分配角标
      • 赋上默认值
    • 静态初始化
      • 开辟连续的内存空间
      • 分配角标
      • 赋值指定的值
  3. 多个变量引用同一个数组
    • 在栈中创建多个变量
    • 多个变量执行堆中的同一个数组对象

三. 数组常见的问题

  1. ArrayIndexOutOfBoundsException

    • 数组角标越界异常
    • 访问了不存在的角标
  2. NullPointerException

    • 空指针异常
    • 栈中的数组变量没有指向堆内存中的数组实体
  3. 演示

    public static void main(String[] args) {
     
     int[] arr = new int[2];
     //会出现数组角标越界异常
     int i = arr[2];
     
     arr = null;
     //会出现空指针异常
     i = arr[0];
    }
    

四. 数组的基本操作

  1. 遍历数组

    • 循环查看数组中每一个元素

      public static void print(int[] arr){
         for (int i = 0; i < arr.length; i++) {
             System.out.println(arr[i]+" ");
         }
      }
      
  2. 获取数组中的最大值

    • 遍历数组, 查找最大的值, 注意, 这个最大值一定是数组中的,所以我们不能随便给最大值变量赋一个默认值

      public static int getMax(int[] arr){
         //定义存储最大值的变量
         int max = arr[0];
         for (int i = 1; i < arr.length; i++) {
             if(arr[i] > max){
                 max = arr[i];
             }
         }
         return max;
      }
      
  3. 反转数组

    • 将数组中的元素按照排列顺序反转, 例如角标0和最后一个角标位上的元素交换

      public static void reverse(int[] arr){
         //数组中的元素前后交换, 遍历的次数只能是数组长度的一半
         for (int i = 0; i < arr.length/2; i++) {
             int temp = arr[i];
             arr[i] = arr[arr.length-i-1];
             arr[arr.length-i-1] = temp;
         }
      }
      
  4. 查找数组中某个值第一次出现的位置

    • 对比数组中每个元素,知道匹配成功,返回当前的角标,如果没有查找到, 返回一个负数

      public static int indexOf(int[] arr,int value){
         //数组中的元素前后交换, 遍历的次数只能是数组长度的一半
         for (int i = 0; i < arr.length; i++) {
             if (arr[i]==value) {
                 return i;
             }
         }
         return -1;
      }
      

五. 二分查找

  1. 定义

    • 使用折半的形式, 一次性剔除一半的无效元素, 提高了查找的效率
    • 使用二分查找的数组必须是有序的
  2. 演示

    public static int binSearch(int[] arr, int value){
     //定义有效元素开始的角标
     int start = 0;
     //定义有效元素结束的角标
     int end = arr.length-1;
     //定义中间的比较值
     int mid ;
     //当有效范围的开始角标已经大于结束角标了,说明已经没有有效元素了
     while(start<=end){
         //计算中间的角标
         mid = (end+start)/2;
         if(arr[mid]==value){
             return mid;
         }else if(arr[mid]>value){
             //如果中间角标位上的值大于要查找的值,
             //说明中间值后面的数都不可能匹配上了
             end = mid - 1;
         }else if(arr[mid]<value){
             //如果中间角标位上的值小于要查找的值,
             //说明中间值前面的数都不可能匹配上了
             start = mid + 1;
         }
     }
     //没有找到的话返回-1
     return -1;
    }
    
    

六. 冒泡排序

  1. 定义

    • 相邻的两个值比较, 然后交换位置, 每次循环都会将有效元素中最大的或最小的移动到有效位的最后
    • 经过多次循环之后,就可以派出一个有序的数组
  2. 演示

    public static void bubbleSort(int[] arr){
     //外循环控制整体的循环次数,每次都可以确定一个最大或最小元素
     for (int i = 1; i < arr.length; i++) {
         //内循环控制有效范围内相邻元素的比较
         for (int j = 0; j < arr.length-i; j++) {
             if(arr[j]>arr[j+1]){
                 int temp = arr[j];
                 arr[j] = arr[j+1];
                 arr[j+1] = temp;
             }
         }
     }
    }
    
    

总结:

  1. 数组

    • 存放多个值得容器
    • 必须确定数据类型
    • 必须确定长度
    • 长度和数据类型都不能修改
  2. 数组的创建

    • 静态初始化 : 先确定具体的数值, 由虚拟机来确定类型和长度
    • 动态初始化 : 先确定类型和长度, 里面是默认值
  3. 数组的默认值

    • 整数: 0
    • 小数: 0.0
    • 字符: \u0000
    • 布尔: false
    • 引用数据类型: null
  4. 数组的使用

    • 通过角标操作数组, 角标从 0开始, 到数组的长度 -1 结束
    • 获取元素 : arr[角标]
    • 设置元素 : arr[角标] = 值;
  5. ​ 数组和循环的结合

    • 循环中的变量 i 设置为从0开始 到 arr.length-1结束

      for(int i = 0 ; i < arr.length ; i++){
          
      }
      
      

作业

  1. 第一题

    • 键盘录入5个学生的年龄, 按照从大到小对年龄进行排序
  2. 第二题

    • 键盘录入多个学生的年龄, 查找年龄为15的学生所在的位置
  3. 扩展题

    • 查阅资料, 思考新的数组排序方法
  4. 扩展题

    在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉一个最低分, 然后剩余的8位评委的分数进行平均,就是该选手的最终得分.输入每个评委的评分,求某选手的得分

相关文章

网友评论

      本文标题:Day05

      本文链接:https://www.haomeiwen.com/subject/ccvjwctx.html