数组

数组的定义格式:
    1: 数据类型[]  数组名
    2: 数据类型    数组名
动态初始化:  初始化的时候 系统会默认给数组赋值
数据类型[] 变量名 = new 数据类型[数组长度]
int[] arr = new int[3]
数组索引:
	数组名[索引]
Java内存分配
	栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
	堆内存:new出来的内存都会进入堆内存 并且会存在地址值
	方法区:字节码文件(.class)加载时进入的内存
	本地方法栈:调用操作系统相关资源
	寄存器:交给CPU去使用
	

java中数组的内存分配

  • 1、程序运行时 先把字节码文件加载到方法区中 main方法存放在字节码文件中
  • 2、main方法被JVM自动调用进入栈内存执行
  • 3、arr数组变量在main方法中声明
  • 4、new int[3]
    • 通过new关键字在堆内存中开辟空间
    • 产生地址值,因为new的是长度为3的数组所以会划分出3块小格子
    • 每个格子都有自己的索引和默认初始化值
  • 5、将地址值赋给main方法中的arr变量
  • 通过地址值找堆中的空间位置 索引值找数组中的位置

oAt28I.png

oAUpOf.png

静态初始化:
	初始化时就可以指定数组要存储的元素,系统还会自动计算出该数组的长度
	
	格式: 数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,....};
	
	int[] arr = new int[]{1,2,3};
	
	简化格式:
	
	int[] arr = {1,2,3};

数组两种初始化

  • 动态初始化:只明确元素个数,不明确具体数值 推荐使用动态初始化
  • 静态初始化:需求中已经明确了要操作的具体操作

数组中的两个小问题

  • 索引越界 : 访问了数组中不存在的索引对应的元素 造成索引越界问题
  • 空指针:访问的数组已经不再指向堆内存的数据 造成空指针异常

数组中的常见操作

遍历

  • public static void main(String[] args) {
        int[] arr = new int[]{1,2,3};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        int[] arr1 = {1,2,3};
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    //arr.length  数组的个数
    

获取最值

public class getarrMax {
    public static void main(String[] args) {
        int[] arr = {132,34,4325,432,5,3,23,4332};
         //1.假设数组中第一个最大

        int max = arr[0];
        //2 遍历比较
        for (int i = 0; i < arr.length; i++) {
            //3 交换
            if(arr[i] > max){
                max = arr[i];
            }
        }
        System.out.println(max);
    }

数组元素求和

public class arr_sum {
    public static void main(String[] args) {
        //1.创建键盘录入对象  准备键盘录入
        Scanner sc = new Scanner(System.in);
        //2.定义求和变量
        int sum = 0;
        //3.动态初始化一个数组
        int[] arr = new int[5];
        //4.键盘录入
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第"+(i+1)+"个整数:");
            arr[i] = sc.nextInt();
        }
        //遍历数组 取出每一个元素 求和
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println("sum:"+sum);
    }
}
  • //1.创建键盘录入对象 准备键盘录入
    Scanner sc = new Scanner(System.in);

  • arr[i] = sc.nextInt(); //获取键盘输入

  • arr.fori 快捷键

  • 注意一个for循环实现一个业务逻辑

查找

  • 需求:已知一个数组arr={19,28,37,46,50};键盘录入一个数据,查找该数据在数组中的索引,并在控制台输出找到的索引值。
  • 步骤:
    • 1、定义一个数组,用静态初始化完成数组元素的初始化
    • 2、键盘录入要查找的数据,用一个变量接收
    • 3、定义一个索引变量,初始值为-1
    • 4、遍历数组,获取数组中的每一个元素
    • 5、拿键盘录入的数据和数组中的每一个元素进行比较如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
    • 6、输出索引变量
public class find_number {
    public static void main(String[] args) {
        int[] arr = {19,28,37,46,50};
        int a = 0; //输入变量
        int k =-1;//索引变量  假设不存在
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要查找的数字:");
        a = sc.nextInt();//可直接定义一个  int num = sc.nextInt();
        for (int i = 0; i < arr.length; i++) {
            if (a == arr[i]){
                k = i;
                break;//注意要提高效率
            }

        }
        System.out.println("索引为:"+(k));
    }

案例

  • 需求:在编程竞赛中,有6个评委为参赛选手打分,分数为0-100的整数分

    选手的最后得分为:去掉一个最高分和一个最低分后的4个评委的平均值(不考虑小数部分)

package com.demoli.arr2;

import java.util.Scanner;

public class GetScore {
    public static void main(String[] args) {
        int[] score_arr = new int[6];
        Scanner sc = new Scanner(System.in);

        for (int i = 0; i < score_arr.length; i++) {
            System.out.println("请输入分数(0-100):");

            int score = sc.nextInt();
            if (score >= 0 && score <=100) {
                score_arr[i] = score;
            }else{
               //非法
                System.out.println("打分有误");
                i--;  //神来之笔
            }

        }
        int max = score_arr[0];
        for (int i = 0; i < score_arr.length; i++) {
            if (max < score_arr[i]){
                max = score_arr[i];
            }
        }


        int min = score_arr[0];
        for (int i = 0; i < score_arr.length; i++) {
            if (min > score_arr[i]){
                min = score_arr[i];
            }

        }

        int sum = 0;
        for (int i = 0; i < score_arr.length; i++) {
            sum += score_arr[i];
        }

        int avg = (sum - max - min) / 4;
        System.out.println(avg);

    }
}
posted @ 2021-12-03 22:37  DemoLi  阅读(95)  评论(0编辑  收藏  举报