【Java基础03】数组及其遍历、最值、反转、查表和基本查找

来源:互联网 发布:java项目的工作流程 编辑:程序博客网 时间:2024/06/05 22:53

数组的定义以及初始化

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 , 1000112306}    //定义一个参照物,假设这个参照物就是最大值    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.结论:
    基本数据类型作为参数传递的时候,形参的改变不影响实际参数。
    引用数据类型作为参数传递的时候,形参的改变对实际参数有影响。
阅读全文
0 0