4、数组array

编程入门 行业动态 更新时间:2024-10-08 13:28:36

4、<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组array"/>

4、数组array

目录

    • 1. 数组概述
    • 2. 数组的定义
      • 2.1 静态初始化数组
      • 2.2 动态初始化数组
    • 3. 数组的遍历
    • 3.1 遍历
    • 3.2 技巧
    • 4. 案例
    • 4.1 求和
    • 4.2 求最值
    • 4.3 猜数字
    • 4.4 随即排名
    • 4.5 冒泡排序
    • 5. 内存图
      • 5.1 内存分配介绍
    • 6. 数组使用的常见问题
    • 7. Debug工具使用

1. 数组概述

  1. 定义:数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。
  2. 示例
String name1 = "张三"
String name2 = "李四"
…
…
String name9 = "王五"
String name10 = "赵六"
// 代码冗余
//使用数组改善
String[] names  = {"张三","李四",……"王五","赵六“};

2. 数组的定义

2.1 静态初始化数组

  1. 定义数组的时候直接给数组赋值
  2. 静态初始化数组 格式
  • 格式1
    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
int[] arr1 = new int[]{12, 24, 36};
double[] arr2 = new double[]{12.1, 13.4, 15.6};
char[] arr3 = new char[]{'a', 'b', 'c'};
String[] arr4 = new String[]{"aa", "bb", "cc"};
  • 格式2
    数据类型[] 数组名 = {元素1,元素2,元素3…};
 int[] arr5 = {12, 24, 36};double[] arr6 = {12.1, 13.4, 15.6};char[] arr7 = {'a', 'b', 'c'};String[] arr8 = {"aa", "bb", "cc"};
  1. 基本原理
    数组变量名:存储数组在内存中的地址,数组是引用类型
    int[] ages = {12, 24, 36}

int[] ages = {12, 24, 36};
System.out.println(ages); //[I@7c30a502
  1. 数组的访问
  • 索引:每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
  • 数组的访问 :数组名称[索引]
    eg:取值ages[2],赋值ages[2] = 100
  • 数组的长度属性:length
    eg:ages.length
  • 数组的最大索引数组名称.length - 1 (注意:元素个数 > 0)
    eg:ages.length - 1
 //数组的访问int[] ages = {12, 24, 36};System.out.println(ages); //[I@7c30a502//取值System.out.println(ages[2]);//赋值ages[2] = 100;System.out.println(ages[2]);//数组的长度属性System.out.println(ages.length);//数组的最大索引int index = ages.length - 1; //元素个数>0
  1. 注意事项
  • 数据类型[] 数组名 等价于 数据类型 数组名[]
  • 什么类型的数组,存放什么类型的数据;
  • 静态数组一旦定义出来,程序执行的过程中,类型、长度就固定了;
        //注意事项//1 `数据类型[] 数组名` 等价于 `数据类型 数组名[]`;int[] ages = {12, 24, 36};int ages1[] = {12, 24, 36};//2 什么类型的数组,存放什么类型的数据;int[] ages2 = {12, 24, "a"};//报错//3 静态数组一旦定义出来,程序执行的过程中,**类型、长度**就固定了;System.out.println(ages[3]);//报错最大索引:2

2.2 动态初始化数组

  1. 动态初始化数组
    定义数组时,只确定数组的长度,由系统给出默认初始化值,之后再存入具体数据。
  2. 动态初始化数组 格式
    数据类型[] 数组名 = new 数据类型[长度];
    eg:int[] arr = new int[3];
  3. 基本原理
    数组的元素值为默认值,如下图,默认值为:0
 //初始化int[] arr = new int[3];for (int i = 0; i < 3; i++) {System.out.println(arr[i]);  //系统默认的初始值:0 0 0}//赋值for (int i = 0; i < 3; i++) {arr[i] = i+1;}for (int i = 0; i < 3; i++) {System.out.println(arr[i]);  //赋值后:1 2 3}
  1. 静态 动态初始化数组区别
    • 已经知道存入元素值,静态初始化
    • 不知道存入什么元素,动态初始化
  2. 动态初始化数组的默认值
//初始化默认值byte[] arrb = new byte[3];for (int i = 0; i < 3; i++) {System.out.println(arrb[i]);  //系统默认的初始值0 0 0}short[] arrs = new short[3];for (int i = 0; i < 3; i++) {System.out.println(arrs[i]);  //系统默认的初始值0 0 0}char[] arrc = new char[3];for (int i = 0; i < 3; i++) {System.out.println(arrc[i]);  //系统默认的初始值0 0 0}int[] arri = new int[3];for (int i = 0; i < 3; i++) {System.out.println(arri[i]);  //系统默认的初始值0 0 0}float[] arrf = new float[3];for (int i = 0; i < 3; i++) {System.out.println(arrf[i]);  //系统默认的初始值0.0 0.0 0.0}double[] arrd = new double[3];for (int i = 0; i < 3; i++) {System.out.println(arrd[i]);  //系统默认的初始值0.0 0.0 0.0}boolean[] arrb1 = new boolean[3];for (int i = 0; i < 3; i++) {System.out.println(arrb1[i]);  //系统默认的初始值false false false}//String引用类型初始化String[] arrs1 = new String[3];for (int i = 0; i < 3; i++) {System.out.println(arrs1[i]);  //系统默认的初始值null null null}

3. 数组的遍历

3.1 遍历

一个一个数据的访问,将数组中的每个元素分别获取出来。
遍历也是数组操作中的基石。

int[] ages = {12, 4, 5, 5, 6, 9, 78};
for (int i = 0; i < ages.length; i++) {System.out.println(ages[i]);
}

3.2 技巧

数组遍历快捷键:数组名.fori eg:ages.fori
内部循环体:数组名[i].souf eg:ages[i].souf

4. 案例

4.1 求和

需求:5个人分别有16,26,36,6,100元,请计算共有多少元?

//求钱数
int[] money = {16, 26, 36, 6, 100};
int sum = 0;
for (int i = 0; i < money.length; i++) {sum += money[i];
}
System.out.println(sum);//184

4.2 求最值

需求:求出一组数据的最大值,{15, 9000, 100, 200, 950, -5}

int[] arr1 = {15, 9000, 100, 200, 950, -5};
// 1.定义变量,保存数组0索引上的元素
int max = arr1[0];// 2.遍历数组,获取出数组中的每个元素
for (int i = 1; i < arr1.length; i++) {// 3.将遍历到的元素和保存数组0索引上值的变量进行比较if (max < arr1[i]){// 4.如果数组元素的值大于了变量的值,变量记录住新的值max = arr1[i];}
}
// 5. 数组循环遍历结束,变量保存的就是数组中的最大值 
System.out.println("the max data:" + max); //9000

4.3 猜数字

需求:游戏后台随机生成1- 20之间的5个数(可重复),然后让大家来猜数字:未猜中提示:"未命中” ,并继续猜测;猜中提示: “运气不错,猜中了”,并输出该数据第一次出现的索引位置,最后把数组中的5个数据都输出看以下,然后结束本游戏。

//猜数字Random rd = new Random();Scanner sc = new Scanner(System.in);//1. 动态初始化数组int[] arr =new int[5];//2. 为动态数组赋值for (int i = 0; i < arr.length; i++) {arr[i] = rd.nextInt(20)+1;}System.out.println("猜数字:1~20!");//3. 通过死循环进行猜测OUT:while(true){int num = sc.nextInt();// 4. 遍历数组每个元素进行对比,相同则给出提示for (int i = 0; i < arr.length; i++) {if (num == arr[i]){System.out.println("运气不错,猜中了," + i);break OUT; //结束死循环,使用OUT跳出:for+while}}// 5.遍历数组每个元素进行对比都不符合,没有跳出循环,再次猜测System.out.println("未命中");}// 6. 输出全部数据for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}

4.4 随即排名

需求,对数组5个元素,打乱顺序后输出。

 // 1. 初始化静态数组int[] arr = {12, 57, 93, 45, 6};// 2.使用random获取随机索引值Random rd = new Random();int index;  //临时变量-索引int t;  //临时变量(中间变量)for (int i = 0; i < arr.length; i++) {//3. 遍历交换索引index= rd.nextInt(5);t = arr[i];arr[i] = arr[index];arr[index] = t;}//4. 输出for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]); ///57 45 12 93 6

4.5 冒泡排序

  1. 数组排序:对数组中的元素,进行升序/降序的操作
  2. 数组排序方法:冒泡排序、选择排序、快速排序、插入排序
  3. 数组查找方法:二分查找、分块查找、哈希查找
  4. 冒泡排序思想:从头开始两两比较,把较大的元素与较小的元素进行交换;每轮把当前最大的一个元素存入到数组当前的末尾。
    比较轮数:length-1 每轮两两比较次数:length - 1 - i
// 1. 定义一个数组int[] arr = {15, 78, 46, 23, 31, 36, 51};// 2. 定义一个循环控制比较轮数for (int i = 0; i < arr.length - 1; i++) {// i == 1, 比较 3 次 == 4-1// i == 2, 比较 2 次 == 4-2// i == 3, 比较 1 次 == 4-3// 3. 每轮比较次数for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]); //23 31 36 46 51 78}

5. 内存图

5.1 内存分配介绍

  • 栈 堆 方法区 本地方法栈 寄存器
  • 内存分配示例
int a = 12;
System.out.println(a); //12int[] arr = {11, 22, 33};
System.out.println(arr); //[I@4c873330arr[0] = 44;
arr[1] = 44;
arr[2] = 66;
System.out.println(arr[0]); //44
System.out.println(arr[1]); //55 
System.out.println(arr[2]); //66
  • 两个变量指向同一个数组

// 两个变量指向同一个数组
int[] arr1 = {11, 22, 33};
int[] arr2 = arr1;  //arr1(数组arr1指向的地址)  赋值给  arr2(数组arr2指向的地址)System.out.println(arr1); //[I@7c30a502
System.out.println(arr2); //[I@7c30a502arr1[0] = 44;
arr2[1] = 77;
System.out.println(arr1[0]); //44
System.out.println(arr1[1]); //77
System.out.println(arr1[2]); //22
System.out.println(arr2[0]); //44
System.out.println(arr2[1]); //77
System.out.println(arr2[2]); //22

6. 数组使用的常见问题

  1. 索引越界异常
    · 如果访问的元素位置超过最大索引length-1,执行时会出现ArrayIndexOutOfBoundsException
    · 解决:修改为正确的索引范围
        int[] a = {1, 2, 3};System.out.println(a[3]);//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at stu.javase.day4.ErrorDemo.main(ErrorDemo.java:6)
  1. 空指针异常
    · 如果数组变量没有保存数组的内存地址,而是null,就不能再操作数组了。在访问数组信息时会抛出 NullPointerException,
    · 解决:给数组变量一个真正的堆内存空间引用
int[] arr = new int[3];
//把null赋值给数组
arr = null;
System.out.println(arr[0]);
Exception in thread "main" java.lang.NullPointerException at stu.javase.day4.ErrorDemo.main(ErrorDemo.java:13)

7. Debug工具使用

  1. DEBUG工具基本使用步骤
    ① 在需要控制的代码行左侧,点击一下, 形成断点
    ② 选择使用Debug方式启动程序,启动后程序会在断点暂停
    ③ 控制代码一行一行的往下执行
  2. 跳过,执行下一个断点
    ① 再点一个断点
    ② 跳到断点处

更多推荐

4、数组array

本文发布于:2024-02-14 05:41:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762215.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   array

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!