JavaSE(04) - 数组

发布时间 2023-09-07 10:43:30作者: 大宝贝94106

JavaSE(04) - 数组

p54 数组介绍

数组是一种容器, 可以用来存储同种数据类型的多个值.

  • 数组容器在存储数据时, 需要结合隐式转换考虑.
  • 例如 : int 类型的数组容器可以兼容(byte, short, int)
  • 例如 : double类型可以兼容(byte, short, int, long, float, double)
  • 建议 : 容器的类型, 和存储数据的类型保持一致.

数组的定义与静态初始化

数组的定义

格式1 : 数据类型 [ ] 数组名 范例 : int [ ] array

格式2 : 数据类型 数组名 [ ] 范例 : int array [ ]

数组的初始化

初始化 : 在内存中,为数组容器开辟空间,并将数据存入容器中的过程.

静态初始化

完整格式 : 数据类型[ ] 数组名 = new 数据类型 [ ] {元素1, 元素2, 元素3 ...};

简写格式 : 数据类型[ ] 数组名 = {元素1, 元素2, 元素3 ...};

p55 数组地址值和元素访问

地址值的含义 : " [ " : 表示当前时一个数组. I/D : 表示当前数组数据类型, @ : 间隔符号, 后面的东西才是真正的地址值, 平时我们习惯把整体叫做数组的地址值.

数组元素访问

获取一个元素 格式 : 数组名 [ 索引 ] ;

  public static void main(String[] args) {
        int[] array1 = new int[]{1, 2, 3, 4};
        int[] array2 = {9, 8, 7, 6};
        System.out.println(array1[0] + "+" + array2[3]);
    }   //结果 1+6

把数据存储到数组中 格式 : 数组名 [ 索引 ] = 具体数据 / 变量 ;

array1[0] = 100;
System.out.println(array1[0]);// 100

p56 数组的遍历

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

注意 : 遍历是指取出数据的过程, 不要局限的理解为,遍历就是打印.

数组的最大索引 = 数组长度 - 1 ;

for (int i =0;i<array1.length;i++){ //调用数组长度  " 数组名.length "
            System.out.println(array1[i]);//遍历数组
}
        System.out.println("长度为"+array1.length);//结果: 长度为4

idea提供的快速生成数组遍历的方法, **数组名 . fori **

练习 : 遍历数组并求和

需求: 定义一个数组, 存储1,2,3,4,5 , 遍历数组每一个元素, 求数组里面所以数据和.

 public static void main(String[] args) {
        int [] arr = {1,2,3,4,5};
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
            sum += arr[i];
        }
        System.out.println("数据的和是: " + sum);
    }

练习 : 统计个数

需求 : 定义一个数组, 存储1,2,3,4,5,6,7,8,9,10 ,遍历数组, 统计一共有几个能被3整除的数

public static void main(String[] args) {
      int[] arr = {1,2,3,4,5,6,7,8,9,10};
      int count = 0;//几个能被3整除的数
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 3 == 0){
                System.out.println(arr[i]);
                count++;
            }
        }
        System.out.println("有"+count+"个数能被3整除.");
    }

练习 : 数据变化

需求 : 定义一个数组, 存储1,2,3,4,5,6,7,8,9,10 ,遍历数组, 要求1: 如果是奇数,就将当前数字扩大两倍. 要求2: 如果是偶数,就将当前数字变成二分之一.

建议大家一个循环做一件事情,如果一个循环做的事太多,自己的思路就会混淆.

 public static void main(String[] args) {
     int [] arr = {1,2,3,4,5,6,7,8,9,10};
        //第一个循环,遍历和修改元素
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]%2==0){//偶数
                arr[i]/=2;  //除以2
            }else {         //奇数
                arr[i]*=2;  //乘以2
            }
        }
        //第二个循环,遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        /*建议大家一个循环做一件事情,如果一个循环做的事太多,自己的思路就会混淆.*/

p57 动态初始化和常见问题

数组的动态初始化

初始化时只给定数组长度, 由系统为数组分配初始值.

格式 : 数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ] ;

范例 : int [ ] arr = new int [3];

数组默认初始化值的规律

整数类型 : 默认初始化值为 0

小数类型 : 默认初始化值为 0.0

字符类型 : 默认初始化值为 '/u0000' 就是空格

布尔类型 : 默认初始化值为 false

引用数据类型 : 默认初始化值为 null

数组的动态初始化和静态初始化的区别

  • 动态初始化 : 手动指定长度, 由系统给出默认初始化值.

​ 只明确元素个数, 不明确具体数值, 推荐使用动态初始化.

​ 举例 : 使用数字容器来存储键盘录入的5个数.

​ int [ ] arr = new int [5];

  • 静态初始化 : 手动指定数组元素, 系统会根据元素个数, 计算出数组的长度.

​ 需求中已经明确了要操作的具体数据, 直接静态初始化即可.

​ 举例 : 将学生成绩存储入数字中 分别为 : 11, 22, 33

​ int [ ] arr ={11,22,33};

p58 数组的常见问题

当访问了数组中不存在的索引, 就会引发索引越界异常

为了避免索引越界异常, 我们要知道索引的范围, 最小索引 : 0 , 最大索引 : (数组长度 - 1)

数组的常见操作练习-求最值

练习 : 求最值

需求 : 已知任意数组和元素, 找出最大值打印在控制台.

/*
1. max的初始化值一定要是数组元素中的值.也不一定时第一个元素.
2. 循环开始条件如果为0, 那么第一次循环就是自己和自己比,对结果没影响,但效率偏低,为了提高效率,减少一次循环次数, 循环开始条件可以改为1.
*/
 public static void main(String[] args) {
        int[] arr = {60, 56, 90, 123, 75, 12, 8, -1, 44};
        int max = arr[0];//初始值为0索引元素的值,临时认为它是最大值
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < max){  //拿每一个元素和max比较
                max = arr[i];   //比max大就赋值给它,替换掉值小的数
            }
        }
        System.out.println(max);

p59 数组练习2-求和统计个数

练习 : 需求 : 生成10个 1~100之间的随机数存入数组.

  1. 求出所以数据的和.
  2. 求所有数据的平均数.
  3. 统计有多少个数据比平均数小.
 public static void main(String[] args) {
        Random random = new Random();
        int[] arr = new int[10];
        int sum = 0;//和
        int count = 0;//统计数字
        for (int i = 0; i < arr.length; i++) {
            int num = random.nextInt(100) + 1;
            arr[i] = num;   //把获得的随机数赋值给每个元素
            sum += arr[i]; //累加所有元素

        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]); //遍历数组
            if (arr[i] < sum / arr.length) {
                count++;        //小于平均数就累加
            }
        }
        System.out.println("元素之和为: " + sum);
        System.out.println("平均数为: " + sum / arr.length);
        System.out.println("有" + count + "个数据小于平均数.");
    }

p60 练习3-交换数据

需求 : 定义一个数组, 存入1,2,3,4,5. 按照要求交换索引对应的元素.
交换前 : 1,2,3,4,5
交换后 : 5,4,3,2,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;    //前面交换到后面
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

p61 练习4-打乱数组中的数据

需求 : 定义一个数组, 存入1~5. 要求打乱数组中所有数据的顺序.

 public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);//获取数组中的随机索引
            int temp = arr[i];  //临时变量中存入前面的元素
            arr[i] = arr[index];  //把随机数元素赋值给前面
            arr[index] = temp;  //把前面的元素赋值给随机数元素
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

p62 数组的内存图

总结 : 当两个数组指向同一个小空间时, 其中一个数组对小空间的值发生了改变, 那么其它数组再次访问的时候就是修改之后的结果了.