数组

数组

1 数组的使用

数组就是装着相同数据类型变量的容器。

数组中的每一个变量称之为叫元素。

数组的声明格式:

数据类型[] 数组名称;
数据类型 数组名称[];

要想使用数组,需要给数组进行初始化。

初始化就是给数组开辟内存空间,并且为每一个空间赋予一个初始的默认值。

初始化的两种方式:

  • 动态初始化(指定长度):在初始化的时候,指定数组的长度,系统根据长度为每一个元素赋予一个初始的默认值。

    • 格式: 数据类型[] 数组名称 = new 数据类型[m];
    • 数据类型:数组中每一个元素的类型,可以是基本数据类型,也可以是引用数据类型
    • []:代表是一个数组
    • 数组名称: 就是数组的标识符
    • new :开辟内存空间
    • m:数组的长度,就是容器中可以存储几个数据
  • 静态初始化(指定元素):在初始化的时候直接指定数组的元素,系统会根据元素的个数决定数组的长度

    • 完整格式:

    • 数据类型[] 数组名称 = new 数据类型[]{元素值1,元素值2,元素值3...元素值n};
      
    • 简便格式:

    • 数据类型[] 数组名称 = {元素值1,元素值2,元素值3...元素值n};
      
    • 注意:简便格式不能分开定义

public static void main(String[] args) {
        // 静态初始化
        int[] arr1 = new int[]{1,2,3,4,5};
        System.out.println(arr1);// [I@4eec7777
        System.out.println(arr1[2]);

        int[] arr2 = {3,4,5,6,7};
        System.out.println(arr2);
        System.out.println(arr2[4]);
        
        int[] arr3;
        arr3 = new int[]{3,4,5};
        
//        int[] arr4;
//        arr4 = {1,2,3};
    }

访问数组元素:

数组名称[索引];

索引是从0开始的,范围是 0 到 数组长度 -1

public static void main(String[] args) {
        // 数据类型[] 数组名称 = new 数据类型[m];
        int[] arr1 = new int[3];
        // [I@4eec7777
        // [:代表是一个数组
        // I:表示是int类型
        // @:分隔符 没有特殊含义
        // 4eec7777:内存的地址  十六进制的表示
        // 内存的地址是唯一的,如果两个数组的地址相同,那么肯定是同一个数组
        System.out.println(arr1);
        // 访问数组中的第一个元素
        System.out.println(arr1[0]);// 0  数组中的元素具有默认值
        arr1[0] = 20;
        System.out.println(arr1[0]);
    }

2 java中的内存分配

java中的内存区域划分为5个

  • 栈内存:存储的都是局部变量
    • 局部变量:凡是定义在方法的大括号的变量,都是局部变量。
    • 局部变量一旦超出了自己的作用域,就不能使用了,内存空间会被回收。
  • 堆内存:存储的都是对象(凡是new出来的东西,都在堆内存中)
    • 对象存储在堆内存中,具有一个首地址值。其中针对不同的数据类型,会赋予初始的默认值。
    • byte/short/int/long 默认值都是0
    • float/double 默认值是0.0
    • char 默认值是 \u0000
    • boolean 默认值是 false
    • 引用数据类型默认值是null
  • 方法区:存储与class相关信息
  • 本地方法栈
  • 寄存器(PC计数器)

3 数组的内存示意图

  • 一个数组的示意图

image-20250621113313324

  • 两个数组的内存图

image-20250621114209333

  • 一个数组指向两个引用的内存图

image-20250621114836376

4 数组常见的两个问题

  • ArrayIndexOutOfBoundsException:数组越界异常
  • NullPointerException:空指针异常

5 遍历数组

获取数组中的每一个元素

public static void main(String[] args) {
        int[] arr = {3,4,5};

        // JDK5特性:增强for循环  只能遍历,不能做其他操作
        for (int e : arr){
           e *= 10;
        }

        // arr.length 动态获取数组的长度
        for (int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }

    }

6 获取数组的最值

public static void main(String[] args) {
        // 获取数组的最值
        int[] arr = {3,2,5,1,6,4};
        // 设置最大值
        int max = arr[0];
        for (int i = 1;i < arr.length;i++){
            if (max < arr[i]){
                max = arr[i];
            }
        }
        System.out.println("最大值是" + max);
    }

7 数组的反转

public static void main(String[] args) {
        // 数组的反转
        int[] arr = {1,2,3,4,5};
        System.out.println(arr);
        // 方式一:
        // 定义新数组,长度和arr长度一样
        // [0,0,0,0,0]
//        int[] tempArr = new int[arr.length];
//        for (int i = 0;i < arr.length;i++){
//            tempArr[arr.length - 1 - i] = arr[i];
//        }
//        // 改变arr的引用
//        arr = tempArr;

        // 方式二:
//        for (int min = 0,max = arr.length - 1;min < max;min++,max--){
//            int temp = arr[max];
//            arr[max] = arr[min];
//            arr[min] = temp;
//        }

        // 方式三:
        for (int i = 0;i < arr.length / 2;i++){
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }


        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }

8 数组的查找

public static void main(String[] args) {
        // 遍历查找
        int[] arr = {3,5,2,1,9};
        int num = 2;
        // 依次比较
//        for (int i = 0;i < arr.length;i++){
//            if (arr[i] == num){
//                System.out.println("数字的索引是" + i);
//            }
//        }
        // 定义变量,记录索引
        int index = 0;
        for (int e : arr){
            if (e == num){
                System.out.println(index);
                break;
            }
            index++;
        }
    }

折半查找/二分查找:要求数组是升序或者降序

public static void main(String[] args) {
        // 二分查找
        int[] arr = {1,3,6,8,10};
        // 定义要查询的数字
        int num = 10;
        // 定义最小和最大索引
        int min = 0;
        int max = arr.length - 1;
        // 计算中间索引
        int mid = (min + max) / 2;
        // 定义标记位  true代表找到了  false代表没找到
        boolean flag = true;
        while (arr[mid] != num){
            // 判断是否大于num
            if (arr[mid] > num){
                max = mid - 1;
            }

            // 判断是否小于num
            if (arr[mid] < num){
                min = mid + 1;
            }

            // 重新计算新的中间索引
            mid = (min + max) / 2;

            if (min > max){
                System.out.println("查无此数");
                flag = false;
                break;
            }
        }
        if (flag)
            System.out.println("查找的数字索引是" + mid);

    }

9 数组的排序

  • 冒泡排序
public static void main(String[] args) {
        int[] arr = {4,3,6,2,1,7,43,23,2345,234};
        for (int i = 1;i < arr.length;i++){// 轮数
            System.out.println("i = " + i);
            for (int j = 0;j < arr.length - i;j++){
                System.out.println("j = " + j);
                if (arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

        System.out.println(Arrays.toString(arr));
    }
  • 选择排序
public static void main(String[] args) {
        int[] arr = {4,3,6,2,1,7};
        for (int i = 0;i < arr.length - 1;i++){
            System.out.println("i = " + i);
            for (int j = i + 1;j < arr.length;j++){
                System.out.println("j = " + j);
                if (arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

10 数组的扩容

数组的长度是固定不变的。一旦创建之后,数组长度不可更改。

public static void main(String[] args) {
        // 数组扩容方式一
        int[] arr = {1,2,3,4,5};
        System.out.println(arr);
//        int[] arr1 = new int[arr.length * 2];
//        // 参数一: 要拷贝的数组的来源
//        // 参数二: 要拷贝的起始索引
//        // 参数三: 要拷贝到哪个数组
//        // 参数四: 要拷贝到的数组的起始索引
//        // 参数五: 要拷贝的数据长度
//        System.arraycopy(arr,0,arr1,0,arr.length);
//        arr = arr1;
//        System.out.println(arr);

        // 参数一: 要扩容的数组
        // 参数二: 要扩容的长度
        arr = Arrays.copyOf(arr,arr.length * 2);
        System.out.println(arr);
        System.out.println(Arrays.toString(arr));
    }

99 乘法表

public static void main(String[] args) {
        // *****
//        for (int i = 0; i < 5; i++) {
//            System.out.print("*");
//        }

        // ctrl + alt + l 格式化代码
        // *****
        // *****
        // *****
        // *****
        // *****
//        for (int i = 0; i < 5; i++) {
//            for (int j = 0; j < 5; j++) {
//                System.out.print("*");
//            }
//            System.out.println();
//        }

        // *
        // **
        // ***
        // ****
        // *****
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "X" + i + "=" + i * j + "\t");
            }
            System.out.println();
        }
    }
posted @ 2025-07-04 22:44  小胡coding  阅读(5)  评论(0)    收藏  举报