zoukankan      html  css  js  c++  java
  • 数组

    数组的定义格式:
        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);
    
        }
    }
    
  • 相关阅读:
    验证码工具包使用
    log4j记录sql语句
    解读redis
    获取选中select的值
    android黑科技系列——Apk混淆成中文语言代码
    android黑科技系列——Xposed框架实现拦截系统方法详解
    android黑科技系列——应用市场省流量更新(增量升级)原理解析
    android黑科技系列——爆破一款应用的签名验证问题
    android黑科技系列——防自动抢红包外挂原理解析
    android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
  • 原文地址:https://www.cnblogs.com/DemoLi/p/15640444.html
Copyright © 2011-2022 走看看