# 数组

数组是最基本的数据结构之一,参考:数据结构+算法

# Java中数组回顾

# 数组定义和访问

# 基本概念

  • 容器概念:是将多个数据存储到一起,每个数据称为该容器的元素
  • 数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。

# 数组的定义

数组有定长特性,长度一旦指定,不可更改

  • 格式1
    • 数组存储的数据类型[] 数组名 = new 数组存储的数据类型[长度];
    • int[] arr = new int[3];
  • 格式2
    • 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
    • int[] arr = new int[]{1,2,3,4,5};
  • 格式3
    • 数据类型[] 数组名 = {元素1,元素2,元素3...};
    • int[] arr = {1,2,3,4,5};

# 数组的访问

# 数组原理内存图

# 内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

# JVM的内存划分

  • 寄存器: 给CPU使用
  • 本地方法栈: JVM在使用操作系统功能的时候使用
  • 方法区: 存储可以运行的class文件
  • 堆内存: 存储对象或者数组,new来创建的,都存储在堆内存
  • 方法栈: 方法运行时使用的内存,比如main方法运行,进入方法栈中执行

# 数组在内存中的存储

  • 一个数组内存图

    • 程序
      public static void main(String[] args) {
          int[] arr = new int[3];
          System.out.println(arr);
      }
      
    • 内存图 一个数组内存图
  • 两个数组内存图

    • 程序
      public static void main(String[] args) {
          int[] arr = new int[3];
          int[] arr2 = new int[2];
          System.out.println(arr);
          System.out.println(arr2);
      }
      
    • 内存图 两个数组内存图
  • 两个变量指向一个数组

    • 程序
      public static void main(String[] args) {
          // 定义数组,存储3个元素
          int[] arr = new int[3];
          //数组索引进行赋值
          arr[0] = 5;
          arr[1] = 6;
          arr[2] = 7;
          //输出3个索引上的元素值
          System.out.println(arr[0]);
          System.out.println(arr[1]);
          System.out.println(arr[2]);
          //定义数组变量arr2,将arr的地址赋值给arr2
          int[] arr2 = arr;
          arr2[1] = 9;
          System.out.println(arr[1]);
      }
      
    • 内存图 指向一个数组内存图

# 数组的常见操作

  • 数组越界异常
    • ArrayIndexOutOfBoundsException
  • 数组空指针异常
    • NullPointerException
  • 数组遍历
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    
  • 数组获取最大值
    public static void main(String[] args) {
        int[] arr = { 1, 3, 7, 5, 2, 1 };
        //定义变量,保存数组中0索引的元素
        int max = arr[0];
        //遍历数组,取出每个元素
        for (int i = 0; i < arr.length; i++) {
            //遍历到的元素和变量max比较
            //如果数组元素大于max
            if (arr[i] > max) {
                //max记录住大值
                max = arr[i];
            }
        } 
        System.out.println("数组最大值是: " + max);
    }
    
  • 数组反转
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
        /*
        循环中定义变量min=0最小索引
        max=arr.length‐1最大索引
        min++,max‐‐
        */
        for (int min = 0, max = arr.length ‐ 1; min <= max; min++, max‐‐) {
            //利用第三方变量完成数组中的元素交换
            int temp = arr[min];
            arr[min] = arr[max];
            arr[max] = temp;
        } 
        // 反转后,遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    

# 数组作为方法参数和返回值

方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.

  • 数组作为方法参数
    • 程序
    public static void main(String[] args) {
        int[] arr = { 1, 3, 5, 7, 9 };
        //调用方法,传递数组
        printArray(arr);
    } 
    /*
    创建方法,方法接收数组类型的参数
    进行数组的遍历
    */
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    
    • 内存图 数组作为方法参数
  • 数组作为方法返回值
    • 程序
    public static void main(String[] args) {
        //调用方法,接收数组的返回值
        //接收到的是数组的内存地址
        int[] arr = getArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    } 
    /*
    创建方法,返回值是数组类型
    return返回数组的地址
    */
    public static int[] getArray() {
        int[] arr = { 1, 3, 5, 7, 9 };
        //返回数组的地址,返回到调用者
        return arr;
    }
    
    • 内存图 数组作为方法返回值

评 论: