Java数组基础

本文详细介绍了数组在编程中的基本概念,包括创建、特点、遍历、默认值、扩容、拷贝方法以及排序(冒泡、选择和快速排序)。还展示了如何使用二分查找法在有序数组中查找元素。
摘要由CSDN通过智能技术生成

一、数组的概念

1、为什么使用数组

  • 如何存储100名学生的成绩?
    • 办法:定义100个变量,每个变量代表一个学生的成绩。
    • 缺点:非常麻烦。
    • 解决方案:数组

2、数组的概念

数组在内存中是一块连续的空间,可以保存相同类型多个数据的容器

3、数组的特点

  • 数组中保存数据必须是相同的数据类型
  • 数组是定长的(数组一旦定义不能改变长度)

二、数组的创建

1、初始化

  • 语法1:

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

  • 语法2:

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

2、静态初始化

  • 语法1:
    数据类型[] 数组名 = {数据1,数据2,...};
  • 语法2:
    数据类型 数组名[] = {数据1,数据2,...};
  • 语法3:
    数据类型[] 数组名 = new 数据类型[]{数据1,数据2,...};

3、数组的细节

  • 数组中的每一个数据称之为数组元素
  • 数组中的每一个元素都对应有一个下标
  • 数组中的下标范围0~数组的长度-1
  • 数组的长度通过数组名.length获取
  • 数组的长度如果超出的边界会报错(ArrayIndexOutOfBoundsException数组下标越界异常)

三、数组的遍历

遍历:获取、保存数据中每一个元素(循环)

四、数组的默认值

  • 整数型数组默认值:0
  • 浮点型数组默认值:0.0
  • 布尔类型数组默认值:false
  • 字符型数组默认值:0 或者' '或者 '\u0000'
  • 引用类型数组默认值:null
    null是一种特殊的值,表示当前对象在内存中没有指向任何地址。
    ""表示空字符串,在内存中有对应的内存地址

五、数组的扩容

数组的扩容和缩容

  • 步骤1:定义一个新数组,然后新数组的长度比原数组增加或者是减小
  • 步骤2:将原来数组的元素拷贝到新数组中
  • 步骤3:将原数组的变量指向新数组

//定义原数组
int[] arr1 = {1,3,46,22,11};

//1、定义新数组   扩容
int[] arr2 = new int[arr1.length+1];

//将原来数组的元素拷贝到新数组中
//arr2[i] = arr1[i]

//2、数组的拷贝
for (int i = 0; i < arr1.length; i++) {
    arr2[i] = arr1[i];
}

//3、将原数组的变量指向新数组
arr1 = arr2;

for (int i = 0; i < arr1.length; i++) {
    System.out.println(arr1[i]);
}

//定义原数组
int[] arr1 = {1,3,46,22,11};

//1、定义新数组
int[] arr2 = new int[arr1.length-1];

//2、数组拷贝
for (int i = 0; i < arr2.length; i++) {
    arr2[i] = arr1[i];
}

//3、将原数组的变量指向新数组
arr1 = arr2;

for (int i = 0; i < arr2.length; i++) {
    System.out.println(arr1[i]);
}

六、数组拷贝

数组的拷贝有三种方式:

  • 通过自定义循环将原数组中的元素拷贝到新数组中

  • System类提供数组拷贝方法

  • //1、System类提供数组拷贝方法
    int[] arr1 = {1,3,46,22,11};

    //定义目标数组
    int[] arr2 = new int[arr1.length + 5];

    /**
    * src:原数组
    * srcPos:原数组的起始位置
    * dest:目标数组
    * destPos:目标数组的起始位置
    * length:拷贝的长度
    */
    System.arraycopy(arr1, 1, arr2, 3, 4);

    for (int i = 0; i < arr2.length; i++) {
        System.out.print(arr2[i]+"\t");
    }

  • Arrays类提供数组拷贝方法

  • //2、Arrays类提供数组拷贝方法
    int[] arr1 = {1,3,46,22,11};

    /**
     * original:原数组
     * newLength:新数组的长度
     * 返回值:返回新数组 
     */

    arr1 = Arrays.copyOf(arr1, arr1.length+1);
    for (int i = 0; i < arr1.length; i++) {
        System.out.print(arr1[i]+"\t");
    }

七、数组排序

1、冒泡排序

冒泡排序升序思想:

  • 1、将相邻的两个元素进行比较,如果前面一个元素比后面的大,就交换位置(一轮比较)
  • 2、将上面的操作循环(比较n-1轮)
  • public class Main {
        public static void main(String[] args) {
            int[] array = {5, 2, 8, 12, 1, 6};

            System.out.println("原始数组:");
            printArray(array);

            bubbleSort(array);

            System.out.println("排序后的数组:");
            printArray(array);
        }

        public static void bubbleSort(int[] array) {
            int n = array.length;

            for (int i = 1; i < n ; i++) {
                for (int j = 0; j < n - i ; j++) {
                    if (array[j] > array[j + 1]) {
                        // 交换相邻元素的位置
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }

        public static void printArray(int[] array) {
            for (int num : array) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }

  • 2、选择排序

    选择排序升序思路:

  • 1、将当前这个数,与他后面每一个数字比较,选择最小的那个数,交换到当前位置
  • 2、循环选择当前位置上的数
  • public class Main {
        public static void main(String[] args) {
            int[] array = {5, 2, 8, 12, 1, 6};

            System.out.println("原始数组:");
            printArray(array);

            selectionSort(array);

            System.out.println("排序后的数组:");
            printArray(array);
        }

        public static void selectionSort(int[] array) {
            int n = array.length;

            for (int i = 0; i < n - 1; i++) {
                int minIndex = i;

                for (int j = i + 1; j < n; j++) {
                    if (array[j] < array[minIndex]) {
                        minIndex = j;
                    }
                }

                // 交换最小元素和当前位置的元素
                int temp = array[minIndex];
                array[minIndex] = array[i];
                array[i] = temp;
            }
        }

        public static void printArray(int[] array) {
            for (int num : array) {
                System.out.print(num + " ");
            }
            System.out.println();
        }
    }

3、Arrays工具类排序方法

public class Demo03 {
    //Arrays类提供的数组排序的方法
    public static void main(String[] args) {
        int[] arr = {11,22,33,31,41,15};

        //Arrays类提供的数组排序的方法     快速排序
        Arrays.sort(arr);

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("==============================================");
        String[] names = {"cxk","rose","lihua","lilei","zhaosi"};

        Arrays.sort(names);

        for (int i = 0; i < names.length; i++) {
            System.out.print(names[i]+"\t");
        }

    }
}

4、二分查找法

二分查找法(折半查找法)

  • 前提:数组中的元素是有序的
  • 思路:
  • //二分查找法
    public static int search2(int[] arr,int num) {
        //1、获取最小、大值的下标
        int min = 0;
        int max = arr.length -1;

        while(min <= max) {
            //2、获取中间值的下标
            int middle = (min + max) / 2;

            //3、将要查找的数字与中间值做比较
            if(num > arr[middle]) {
                min = middle +1;
            }else if(num < arr[middle]) {
                max = middle -1;
            }else {
                return middle;
            }
        }
        return -1;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值