数组的相关概念

一、数组概述和静态初始化

数组:作用类似于变量,可以存储同种数据类型的多个值
在这里插入图片描述
在这里插入图片描述
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组的初始化有两种方式:静态初始化动态初始化

静态初始化
在这里插入图片描述
在这里插入图片描述

二、数组的地址值和元素访问

地址值:表示数组在内存中的位置。
在这里插入图片描述
数组元素的访问:
格式: 数组名[索引]
在这里插入图片描述
另外:可以使用具体的数据存储到数组中,但这样做,以前的数据就会被覆盖。
在这里插入图片描述

三、数组的遍历

数组遍历:将数组中所有的内容取出来取出来之后可以(打印,求和,判断…)

.length方法

调用方式:数组名.length
可用for循环进行遍历,循环停止条件为:i < 数组名.length
扩展:
IDEA中可用数组名.fori快速生成遍历数组元素的for循环。

3.1 数组遍历的练习

Test1:

public class ArrayDemo1 {
    public static void main(String[] args) {
        // 定义一个数组,存储1-5,遍历每个元素并求和
        int[] array1  = {1,2,3,4,5};
        int sum = 0;

        for (int i = 0; i < array1.length; i++) {
            sum += array1[i];  
            //i表示数组的索引;array1[i]则表示每个元素
        }
        System.out.println(sum);
    }
}

Test2:

public class ArrayTest1 {
    /*
    定义一个数组,存储1,2,3,4,5,6,7,8,9,10
    遍历数组得到每一个元素,统计数组里面一共有多少个能被3整除的数字
     */
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5,6,7,8,9,10};
        int count = 0;

        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] % 3 == 0){
                count++;
            }
        }
        System.out.println("数组arr1中能被3整除的数共有" + count + "个");
    }
}

Test3:

public class ArrayTest2 {
    /*
    定义一个数组,存储1,2,3,4,5,6,7,8,9,10遍历数组得到每一个元素。要求:
    如果是奇数,则将当前数字扩大两倍
    如果是偶数,则将当前数字变成二分之一
     */
    public static void main(String[] args) {
        int[] arr2 = {1,2,3,4,5,6,7,8,9,10};

        for (int i = 0; i < arr2.length; i++) {
            if (arr2[i] % 2 ==1){
                arr2[i] *= 2;
            }else if (arr2[i] % 2 ==0){
                arr2[i] /=2;
            }
            System.out.println(arr2[i]); 
            //不推荐这样写,打印可以另写一个循环,一个循环做一件事就好
        }
    }
}

四、数组的动态初始化和常见问题

4.1 数组的动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

格式:
数据类型[] 数组名= new 数据类型[数组长度];
public class ArrayDemo2 {
    /*
    定义一个数组,用来存班级中50个学生的姓名
    姓名未知,等学生报道之后,再进行添加。
     */
    public static void main(String[] args) {
        String [] name = new String[50];

        //添加
        name[0] = "zhangsan";
        name[1] = "lisi";

        System.out.println(name[0]);
        System.out.println(name[1]);
        System.out.println(name[2]);//尚未添加,打印结果是初始化的值
    }
}

在这里插入图片描述

扩展:

数组默认的初始化规律

  • 整数类型:默认初始化值0
  • 小数类型:默认初始化值0.0
  • 字符类型:默认初始化值 /u0000,打印出来是空格
  • 布尔类型:默认初始化值 false
  • 引用数据类型:默认初始化值 null(引用数据类型:除了四类八种以外的所有)

4.2 静态初始化和动态初始化的区别

在这里插入图片描述

4.3 常见问题——索引越界

出现原因:访问了不存在的索引;
避免方式:知道数组索引范围,即,从0开始,到数组长度-1结束。

4.4 对数组的常见操作

1.求最值

public class Test3 {
    /*
    已知数组元素为{33,5,22,44,55}
    请找出数组中最大值并打印在控制台
     */
    public static void main(String[] args) {
        int [] arr= {33,5,22,44,55};
        int max = arr[0];

        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max){
                max = arr[i];
            }
        }
        System.out.println(max);
    }
}

2.求和并统计个数

public class Test4 {
    /*
    生成10个1~100之间的随机数存入数组
    1)求出所有数据的和
    2)所有数据的平均数
    3)统计有多少个数据比平均值小
     */
    public static void main(String[] args) {
        int [] num = new int[10];
        int sum = 0;

        // 生成10个随机数存入数组
        for (int i = 0; i < 10; i++) {
            Random r = new Random();
            int number = r.nextInt(100)+1;
            num[i] = number;
        }
        // 求和
        for (int i = 0; i < 10; i++) {
            sum += num[i];
        }

        int average = sum / 10;
        int count = 0;

        //求几个小于平均
        for (int i = 0; i < 10; i++) {
            if (num[i] < average){
                count++;
            }
        }

        System.out.println("总和为:" + sum);
        System.out.println("平均为:" + average);
        System.out.println("小于平均数的共有:" + count + "个");
    }
}

3.交换数据*

public class Test5 {
    /*需求:定义一个数组,存入1,2,3,4,5.按照要求交换索引对应的元素
    交换前:1,2,3,4,5    交换后:5,2,3,4,1*/
    public static void main(String[] args) {
        int [] arr = {1,2,3,4,5};

        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] =temp;
        }
    }
}

4.打乱数据

import java.util.Random;

public class Test6 {
    //需求:定义一个数组,存入1~5。要求打乱数组中所有数据的顺序
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};

        for (int i = 0; i < arr.length; i++) {
            Random r = new Random();
            int num = r.nextInt(5);

            int temp = arr[i];
            arr[i] = arr[num];
            arr[num] = temp;
        }
    }
}

五、数组的内存图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当定义一个数组时:
在这里插入图片描述
在这里插入图片描述

总结

  • 只要是new出来的一定是在堆里面开辟了一个小空间
  • 如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据

特殊情况:两个数组指向同一个空间
在这里插入图片描述
总结
当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要努力的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值