8.11Java之数组知识回顾

数组

  • 一维数组的定义与使用方式

  • 数组基本练习

  • Arrays工具类

  • 案例---点名器

  • 二维数组

数组定义

相同类型数据的有序集合

  • 一开始大小固定--->开始初始化

  • 数组本身属于引用类型--->初始化需要new一个对象并且开辟空间

  • 数组中可以存储任意类型的数据

创建数组时的内存分配说明

8.11Java之数组知识回顾_for循环

数组的使用

通过索引去使用数组:

数组的遍历方式

普通for循环:

增强for循环:--->因为数组本身是一个对象

普通for循环打印数组内容
    /**
    * 普通for循环方法
    */
   public static void forArray(){
       int[] number = {1,2,3,4,5};
       for (int i=0; i<number.length; i++){
           System.out.println(number[i]);
      }
  }
增强for循环打印数组内容
    /**
    * 增强for循环打印数组内容
    */
   public static void forEachArray(){
       int[] number = {5,4,3,2,1};
       for (int num : number){
           System.out.println(num);
      }
  }

这两种打印方法在本质上是有区别的主要区别在内存上:

普通for循环:

  • 打印的number[i]中这个"i"是一个引用

增强for循环:

  • 将堆内存的数组中的值取出,放入到变量num当中,再去打印出。不便于引用

数组的关键理解
    /**
    * 数组赋值的方法
    */
   public static void changeArray(){
       //int[] number = {};
       /*
       上面这个写法实际上在堆内存当中并没有开辟对象空间
       所以之前直接循环是无法对数组进行赋值
       基本数据类型的数组无法使用动态分配的方式进行赋值
       因为基本数据类型不需要new一个对象去创建。即便使用包装类那么返回的也是一个基本数据类型的值
       而该值不需要创建对象
        */
       int[] number = new int[10];
       for (int i=0; i<10; i++){
           number[i] = 10*(i-1);
           System.out.println(number[i]);
      }
  }

   /**
    * 动态分配空间赋值
    */
   public static void changeArrays(){
       int[] number = {};
       for (int i=0; i<number.length; i++){
           number[i] = new Integer(10*(i-1));
           System.out.println(number[i]);
      }
       /*
       可以通过编译,但是没有结果
        */
  }
数组练习
    /**
    * 遍历char数组,倒序输出数组内容
    * @param arr
    */
   public static void print(char[] arr){
       for (int i=arr.length-1; i>=0; i--){
           System.out.println(arr[i]);
      }
  }
    /**
    * 遍历int数组,获取最大值和最小值
    * @param arr
    */
   public static void printMaxMin(int[] arr){
       int max = arr[0];
       int min = arr[arr.length-1];
       for (int i=0; i<arr.length; i++){
           if (arr.length==1){
               System.out.println(arr[i]);
          }else {
               if (arr[i]>max){
                   max = arr[i];
              }else if (arr[i]<min){
                   min = arr[i];
              }
          }
      }
       /*
       抓头尾设为变量,然后用数据进行比较
       因为是比较大小所以需要比较必须有比较的对象
        */
       System.out.println(max);
       System.out.println(min);
  }
    /**
    * 实现一个随机的点名器
    *     使用循环去读取多对象--->设置索引为随机的
    * @param arr
    */
   public static void randomPrintName(String[] arr){
       int randomnumber = (int) (Math.random()*arr.length);
       System.out.println(arr[randomnumber]);
  }
多维数组

本章以二维数组进行举例

二维数组的定义:

数组中套数组

8.11Java之数组知识回顾_二维数组_02

定义二位数组

实例:

static int[][] doubleArray = {{1,2},{2,3},{3,4}};
//如果使用的是直接定义长度的话
//不同维度的数组可以定义不同的空间长度

打印二维数组内的内容

实例:

    public static void print(int[][] arr){
       for (int[] num : arr){
           for (int number : num){
               System.out.println(number);
          }
           System.out.println(num);
      }
  }

num为引用,打印出来的是一个hash地址

number为内容的引用,打印出来的是具体值

二维数组的内存分析举例

8.11Java之数组知识回顾_for循环_03

注意:

  • 无论几维数组,都是引用类型

  • 其对象分配的空间都在堆中

给二维数组定义长度
    static int[][] doubleArrays = new int[5][]; //这里就没有定义二维数组的长度
   public static void createSpace(int[][] arr){
       arr[0] = new int[2];
       arr[0][1] = 1;
       System.out.println(arr[0][1]);
       /*
       因为要给二维数组的内部再进行长度定义,那么需要找到一位数组的索引
       然后再通过新建对象的方法给该索引下的空间进行长度定义
        */
  }

 

It's a lonely road!!!