数组的定义以及初始化

1.数组可以存储基本数据类型和引用数据类型。但是所有元素必须是一个类型。
2.格式 :
  • 1) 数据类型 [ ] 数组名; // 定义了一个int类型的数组a
  • 2) 数据类型 数组名 [ ]; //定义了一个int类型的a数组
3.数组的初始化
  • 1) 动态初始化:只指定长度,有系统初始化值
  • 2) 静态初始化:给出初始化值,由系统决定长度
4.动态初始化
  • 数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ] ;
  • int [ ] arr = new int [3];
  • 数组长度就是数组中元素的个数(或者容器的大小)
5.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)
6. 数组的初始化不能动静结合
int[] arr = new int[]{1,2,3};   //静态初始化
    int[] arr = {1,2,3};            //静态初始化
    int[] arr = new int[3]{1,2,3};  // X ,不可取
7.数组中的两个小问题:
  • 1) java.lang.ArrayIndexOutOfBoundsException 原因:数组角标越线,角标不能小于0且最大索引是数组长度-1
  • 2) java.lang.NullPointerException 原因:访问了null的属性分或者方法。如果数组初始化为null,该变量就不指向堆内存中的任何地址。

数组中的常见操作

1.数组的遍历
  • 1)普通的输出
for( int i = 0 ; i < arr.length-1 ; i++){
    System.out.println(arr[i]);
}
  • 2)带格式的输出
System.out.println("[");
for( int i = 0 ; i < arr.length ; i++){
    if(i == arr.length - 1){
            System.out.println(arr[i] + "]");
    }else{
            System.out.println(arr[i]+",  ");
            }
}
2.获取数组的最值
//定义一个数组
    int[] arr = { 10000, 9527 , 10086 , 95535 , 10001,12306}

    //定义一个参照物,假设这个参照物就是最大值
    int max = arr[0];

    for( int i = 0; i< arr.lrngth ; i++){
        //获取一个元素,跟参照物进行比较
        if ( arr[i] > max ){
        //现在最大值是我们遍历到的这个数,需要将参照物设置成当前的这个数
        max = arr[i];
        }
    }
3.数组元素的反转
//打印反转之前的数组 
    int[] arr = {1,2,3,4,5,6,7,8,9};

    //定义2个索引
    int startIndex = 0;
    int endIndex  = arr.length - 1;

        for(int i = 0; i<arr.length; i++){
            if(startIndex >= endIndex) {
                break;
            }

            //交换两个索引对应元素的值
            int temp =arr[startIndex];
            arr[startIndex] = arr[temp];
            arr[endIndex]  = temp;

            startIndex++;
            endIndex--;
        }
    //遍历数组的方法
4.数组的查表法
  • 需求:根据键盘录入索引,查找对应星期
//定义一个数组,存储的是星期的数据
String[] arr = {"","星期一","星期二","星期三",
                   "星期四","星期五","星期六",
                   "星期日",
       }

Scanner sc   = new  Scanner(System.in);
int  index = sc.nextInt() - 1;

//对用户输入的数据进行校验
if( index <= 1  ||  index > arr.length - 1){
    System.out.println("请输入一个1-7的整数!");
}else{
    System.out.println(arr.[index]);
    }
5.基本查找(查找指定元素第一次在数组出现的索引)
  • 定义一个方法获取指定元素第一次在数组中出现的索引
  • 1.返回值类型 int
  • 2.参数列表 int[] arr,int data
  • int[] arr表示要查找的数组
  • int data 表示的是需要查找的那个元素
//定义一个数组
    int[] arr = {12,23,67,90,88}

    //【法一】
    public static int getIndex(int[] arr){
        //遍历数组,和data进行判断    
        for(int i = 0; i<arr.length;i++){
            if(arr[i]==data)
            return i;
         }
      //如果程序走到这说明没有找到这个数,返回负数说明没找到
        return -1;
    }

【二维数组】

  • 1.格式:
  • a.数据类型 数组名[][] =new 数据类型[m][n];
  • b.数据类型[] 数组名[] =new 数据类型[m][n];
  • *b不推荐使用
  • 2.定义二位数组,输出二维数组的名称,输出每一个一维数组的名称,输出二维数组的两个元素
    //定义一个二维数组
int[][] arr =new int[2][2];
//打印二维数组的名称
    System.out.println(arr);
  • 3.二维数组的内存图解 (见doc)
  • 4.二位数组格式2
  • 1) 数据类型[][] 变量名 = new 数据类型[m][];
  • 2) m表示二维数组中有多少个一维数组,但是现在一维数组还没有 定义
  • 3)Demo定义一个二维数组,输出为二维数组的名称和二维数组的每一个一维数组;然后动态给二维数组赋值一维数组,再次输出二维数组中的每一个一维数组,给二位数组的中的元素赋值,输出对应的元素值。
int[][] arr = new int[2][];
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);

        //动态的给一维数组赋值
        arr[0] = new int[3];
        arr[1] = new int[2];

        System.out.println(arr[0]);
        System.out.println(arr[1]);

        //给每一个一维数组赋值
        arr[0][0] = 63;
        arr[0][1] = 56;

        System.out.println(arr[0][0]);
        System.out.println(arr[1][1]);
        //以上代码原理图见docx和笔记
  • 5.二维数组格式3
    见doc
  • 1)Demo
/*
    定义一个二维数组,需要对二维数组进行初始化
    打印一个二维数组中的一维数组,再打印每一个二维数组中的元素
*/
    int[][] arr = {{1,2,3},{4,5},{6}};
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);

    System.out.println(arr[0][2]);//3
    System.out.println(arr[1][1]);//5
    System.out.println(arr[2][0]);//6
    //以上内存图见docx
  • 6.遍历二维数组
//定义一个二维数组
    int[][] arr =  {{1,2,3},{4,5},{6}};
    //遍历
    for(int x = 0;x<arr.length;x++){
        for(int i = 0;i<arr[x].length;i++){
                System.out.println(arr[x][i]);
                     } 
    }

//优化见源码

练习

  • 1.需求:公司年销售额求和
    某公司按照季度和月份统计的数据如下:单位:万元
    第一季度:22,66,44
    第二季度:77,33,88
    第三季度:25,45,65
    第四季度:11,66,99
//定义一个二维数组用来存储每一个季度的销售信息
int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}
//计算二维数组中所有元素的总和

见源码
  • 2.结论:
    基本数据类型作为参数传递的时候,形参的改变不影响实际参数。
    引用数据类型作为参数传递的时候,形参的改变对实际参数有影响。