day04 数组

学习目录

熟悉数组定义


(资料图片仅供参考)

掌握数组初始化

动态初始化

静态初始化

掌握数组相关操作

索引

求数组长度

遍历数组

求最大值

求最小值

求和

求平均值

冒泡排序

数组数组操作中出现问题

索引越界异常

空指针异常

了解数组的内存图

java 内存结构

单个数组的内存图

多个数组指向各自堆内存的内存图

多个数组指向同一个堆内存的内存图

1.数组定义和定义格式

数组是一个容器用来存储相同数据类型数据的容器    格式:   数据类型 [] 数组名;   int [] arr; 数据类型 数组名 []; int arr[]

2.数组的初始化

2.1数组动态初始化

2.1.1数组动态初始化的格式

/*    动态初始化格式:        数据类型 [] 数组名 = new 数据类型[长度]; //必须是>=0正整数        int [] arr = new int[3]; //定义一个能够存储 int类型相匹配的数据长度为3的数组 */public class Demo01 {    public static void main(String[] args) {        int [] arr = new int[3];        System.out.println(arr); //[I@119d7047        /*            [I@119d7047            [: 这个地址是数组的            I:int类型            @:分隔符            119d7047:数组在内存中16进制地址         */    }}

2.2动态初始化数组的操作

2.2.1动态初始化数组取值

/*    动态初始化数组取值:        格式:数组数据类型 变量名 = 数组名[索引];    索引:        索引就是数中每个初始化空间的编号,索引从0开始 到数组长度减一 ,索引是连续的,每次递增一    动态初始化数组有默认:        byte short int long 类型的数组有默认值 0        float double 类型的数组有默认值 0.0        char 类型的数组有默认值 '\u0000'        boolean 类型的数组有默认值 false    引用数据类型数据有默认值:        null */public class Demo02动态初始化数组取值 {    public static void main(String[] args) {        int [] arr = new int[3];        System.out.println(arr); //[I@119d7047        //数组索引 就是 0 1 2        //格式:数组数据类型 变量名 = 数组名[索引];        int a = arr[0];        System.out.println(a);        int b = arr[1];        System.out.println(b);        int c = arr[2];        System.out.println(c);        System.out.println("--------");        byte[] brr = new byte[3];        System.out.println(brr[0]);        System.out.println(brr[1]);        System.out.println(brr[2]);        System.out.println("--------");        short[] crr = new short[3];        System.out.println(crr[0]);        System.out.println(crr[1]);        System.out.println(crr[2]);        System.out.println("--------");        long[] drr = new long[3];        System.out.println(drr[0]);        System.out.println(drr[1]);        System.out.println(drr[2]);        System.out.println("--------");        float[] err = new float[3];        System.out.println(err[0]);        System.out.println(err[1]);        System.out.println(err[2]);        System.out.println("--------");        double[] frr = new double[3];        System.out.println(frr[0]);        System.out.println(frr[1]);        System.out.println(frr[2]);        System.out.println("--------");        char[] grr = new char[3];        System.out.println(grr[0]);        System.out.println(grr[1]);        System.out.println(grr[2]);        System.out.println("--------");        boolean[] hrr = new boolean[3];        System.out.println(hrr[0]);        System.out.println(hrr[1]);        System.out.println(hrr[2]);        System.out.println("--------");        String[] srr = new String[3];        System.out.println(srr[0]);        System.out.println(srr[1]);        System.out.println(srr[2]);    }}

2.2.2数组遍历

/*    动态初始化数组的遍历:        1.索引是连续的,每次递增一        2.使用循环遍历获取数组的索引        3.根据索引获取值 */public class Demo03动态初始化数组的遍历 {    public static void main(String[] args) {        //定义长度为5的数组        int [] arr = new int[5];        System.out.println(arr);        /*System.out.println(arr[0]);        System.out.println(arr[1]);        System.out.println(arr[2]);        System.out.println(arr[3]);        System.out.println(arr[4]);*/        for (int i = 0; i < 5; i++) {            //打印索引//            System.out.println(i);            System.out.println(arr[i]);        }    }}

2.2.3动态初始化数组的赋值

/*    动态初始化数组的赋值:        格式:            数组名[索引] = 值; */public class Demo04动态初始化数组的赋值 {    public static void main(String[] args) {        int [] arr = new int[3];        // 数组名[索引] = 值;        arr[0] = 10;        arr[1] = 20;        arr[2] = 30;        //使用for循环遍历数组 取值        for (int i = 0; i < 3; i++) {            System.out.println(arr[i]);        }    }}

2.3数组静态初始化

2.3.1数组静态初始化格式

/*    数组静态初始化格式:        格式1:            数据类型 [] 数组名 = new 数据类型[]{... ...}            int [] arr = new int[]{1,2,3,4,5,6,7,8,9};        格式2:            数据类型 [] 数组名 = {... ...}            int [] arr = {1,2,3,4,5,6,7,8,9};    静态初始化数组用来存放已知值    求数组的长度:        格式:数组名.length    遍历数组的通用格式:        for (int i = 0; i < 数组名.length; i++) {            System.out.println(数组名[i]);        } */public class Demo05数组静态初始化格式 {    public static void main(String[] args) {        //数据类型 [] 数组名 = new 数据类型[]{... ...}        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};        //数据类型 [] 数组名 = {... ...}        int[] brr = {1, 2, 3, 4, 5, 6, 7, 8, 9};        //遍历数组        for (int i = 0; i < 9; i++) {            System.out.println(brr[i]);        }        System.out.println("----------------------------");        int[] crr = {1, 2, 3, 4, 5, 6, 7, 8, 9};        //求数组的长度:格式:数组名.length//        int length = crr.length;//        System.out.println(length);        for (int i = 0; i < crr.length; i++) {            System.out.println(crr[i]);        }        }}

2.4数组操作

2.4.1 求和

/*    需求:某部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额。    分析:        1.定义变量用来存储最终和        2.遍历数组获取数组中的每一个元素        3.累加求和        4.输出最终和 */public class Demo01 {    public static void main(String[] args) {        int [] arr = {16,26,36,6,100};        //1.定义变量用来存储最终和        int sum = 0;        //2.遍历数组获取数组中的每一个元素        for (int i = 0; i < arr.length; i++) {            //3.累加求和            sum+= arr[i];        }        //4.输出最终和        System.out.println("总销售额:"+sum+"万元");    }}

2.4.2 求最大值

/*    数组元素求最大值:    int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};    分析:        1.先定义最大值 ,最大值从数组取,默认取第一个        2.遍历数组获取数组中的每一个元素        3.和最大值比较,如果比最大值还要大,跟新最大值        4.求出最大值并输出 */public class Demo02 {    public static void main(String[] args) {        int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};        //1.先定义最大值 ,最大值从数组取,默认取第一个        int max = faceScores[0];        //2.遍历数组获取数组中的每一个元素        for (int i = 0; i < faceScores.length; i++) {            //3.和最大值比较,如果比最大值还要大,跟新最大值            if (faceScores[i]>max){                max = faceScores[i];            }        }        //4.求出最大值并输出        System.out.println("颜值最高的美女是:"+max);    }}

2.4.3 求最小值

/*`   数组元素求最小值:        1.定义一个最小值,最小值从数组中取,默认是第一个元素        2.遍历数组,获取中的每一个元素        3.和最小值比较,如果比最小值还要小,就更新最小值        4.求出最小值并输出 */public class Demo03 {    public static void main(String[] args) {        int[] arr = {10, 20, 98, 78, 2, 5};        //1.定义一个最小值,最小值从数组中取,默认是第一个元素        int min = arr[0];        //2.遍历数组,获取中的每一个元素        for (int i = 0; i < arr.length; i++) {            //3.和最小值比较,如果比最小值还要小,就更新最小值            if (arr[i]<min){                min = arr[i];            }        }        //4.求出最小值并输出        System.out.println("数组中元素的最小值:"+min);    }}

2.4.4 数组随机排序

/*    某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请先依次录入5名员工的工号,然后展示出一组随机的排名顺序。    22 33 35 13 88   分析:    1.先使用数组 存储 员工号    int [] arr = {22,33,35,13,88}    2.定义新的数组    int [] brr = new int[arr.length];    3.生成随机数 取值范围 0 -- 4    4.使用随机数当做索引 从arr数组取出元素存放到brr 数组中【提示判断工号是否已经被存储】 */public class Demo04 {    public static void main(String[] args) {        //1.先使用数组 存储 员工号        int[] arr = {22, 33, 35, 13, 88};        //2.定义新的数组        int[] brr = new int[arr.length];        //3.生成随机数 取值范围 0 -- 4        Random random = new Random();        for (int i = 0; i < arr.length; i++) {            //获取随机数 取出随机数对应的数组中元素            int id = arr[random.nextInt(5)];            //引入第三方变量 判断数字是否被使用 默认是没有被使用            boolean falg = true;            //判断id 是否在brr中            for (int j = 0; j < brr.length; j++) {                int x = brr[j];                if (x == id) {                    falg = false;                    i--;                    break;                }            }            if (falg) {                brr[i] = id;            }        }        System.out.println(Arrays.toString(brr));    }}

2.4.5 冒泡排序

import java.util.Arrays;/*    1.相邻的两个数据 两两比较如果前面大于后面的就交换位置    2.第一轮交换完成后,确定最大值    3.数组有多长,我们就是交换多少轮 */public class Demo05 {    public static void main(String[] args) {        int [] arr = {5,4,3,2,1};        for (int j = 0;j < arr.length; j++) {            for (int i = 0; i < arr.length-1 -j; i++) {                if (arr[i]>arr[i+1]){                    int temp = arr[i];                    arr[i] = arr[i+1];                    arr[i+1] = temp;                }            }            System.out.println("第"+(j+1)+"轮交换结果:"+Arrays.toString(arr));        }        System.out.println(Arrays.toString(arr));    }}

3.数组的内存图

3.1java的内存分配

/*      java的内存结构:        栈:方法运行时所进入的内存        堆:new 出来的东西会在这块内存中开辟空间并产生地址        方法区:字节码文件加载时进入的内存        本地方法栈:和操作系统交互        程序计数器:每个线程都拥有一个独立的程序计数器,用于记录当前线程所要执行的字节码指令,该类内存区域为“线程私有”内存        寄存器:和cpu相关 */public class Demo01 {}

3.2单个数组的内存图

/*    单个数组指向自己的堆内存,无论如何修改数据,最后取值的时候,取得是修改后的最新值 */public class Demo02 {    public static void main(String[] args) {        int[] arr = new int[3];        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);        System.out.println(arr[2]);        arr[0] = 10;        arr[1] = 20;        arr[2] = 30;        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);        System.out.println(arr[2]);    }}

3.3多个数组的内存图 指向各自的堆内存

/*多个数组指向各自的堆内存,无论如何修改自己的堆内存中数据,再去取值的时候,取得是修改后的最新值 */public class Demo03 {    public static void main(String[] args) {        int[] arr = new int[2];        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);        arr[0] = 10;        arr[1] = 20;        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);        int[] brr = new int[2];        System.out.println(brr);        System.out.println(brr[0]);        System.out.println(brr[1]);        brr[0] = 11;        brr[1] = 22;        System.out.println(brr);        System.out.println(brr[0]);        System.out.println(brr[1]);    }}

3.4多个数组的内存图 指向同一片的堆内存

/*    多个数组指向同一个对内存,无论谁修改堆内存中的数据,后来取值的时候取得是修改后的最新值 */public class Demo04 {    public static void main(String[] args) {        int[] arr = new int[2];        arr[0] = 10;        arr[1] = 20;        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);        int[] brr = arr;        System.out.println(brr);        System.out.println(brr[0]);        System.out.println(brr[1]);        brr[0] = 11;        brr[1] = 22;        System.out.println(brr);        System.out.println(brr[0]);        System.out.println(brr[1]);        System.out.println(arr);        System.out.println(arr[0]);        System.out.println(arr[1]);    }}

4.数组操作中常见问题

public class Demo01 {    public static void main(String[] args) {        int [] arr = new int[3];        //访问了不存在索引 ArrayIndexOutOfBoundsException        //System.out.println(arr[3]);//ArrayIndexOutOfBoundsException//        arr[5] = 20;        arr = null;//        arr[0] = 10; //NullPointerException    }}

推荐阅读

更多 >

最近更新

更多 >