Java基础学习-数组

本文详细介绍了Java中的数组,包括数组的概念、创建、初始化、使用注意事项、数组的拷贝、转换为字符串、排序、查找和反转等操作。此外,还展示了如何通过工具类Arrays进行操作,以及提供了多个实战示例,如计算平均值、顺序查找和二分查找等。
摘要由CSDN通过智能技术生成

数组

1. 什么是数组

数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。比如现实中的车库:

一组连续的空间,存放的是一组相同数据类型的数据

 int[] array = {1,2,3,4,5,6,7,8,9,10};

array[下标]

2. 基本语法

2.1 数组的创建

T[] 数组名 = new T[N];

T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度

2.2 数组的初始化

数组的初始化主要分为动态初始化以及静态初始化

  1. 动态初始化:在创建数组时,直接指定数组中元素的个数
// 动态初始化 
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 }; 
int[] arr = new int[]{1, 2, 3}; 
int[] arr = new int[10];  //大小为10,默认存储的就是0
  1. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
    语法格式: T[] 数组名称 = {data1, data2, data3, …, datan};
// 静态初始化 
数据类型[] 数组名称 = { 初始化数据 };
int[] arr = {1, 2, 3};
int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组

【注意事项】

  • 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
  • 静态初始化时, {}中数据类型必须与[]前数据类型一致。
  • 静态初始化可以简写,省去后面的new T[]。

注:

int[] array1 = {1,2,3,4,5};   //整体初始化,只有一次机会,
int[] array1 = new int[10];  
array = {1,2,3,4,5};   //这样是会出错的

3. 数组的使用

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        System.out.println(array.length);   //获取数组长度

        System.out.println(array[0]);  //获取0下标数据
        System.out.println(array[1]);  //获取1下标数据
        array[0] = 999;            //修变数组的值
        System.out.println(array[0]);

    }

注意事项

  1. 使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作符. 后面在面向对象中会经常用到.
  2. 使用 [ ] 按下标取数组元素. 需要注意, 下标从 0 开始计数
  3. 使用 [ ] 操作既能读取数据, 也能修改数据.
  4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常

下标越界问题

在这里插入图片描述

打印数组的三种方法

public static void main(String[] args) {
        int[] array = {1,2,8,4,5};
        //System.out.println(array[6]);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        System.out.println("========增强for循环==========");   //for-each
        for (int val :array){    // for (数组当中每个元素的类型的变量 :数组名)
            System.out.print(val + " ");
        }
		System.out.println("==========使用操作数组的工具类Arrays============");
        String ret = Arrays.toString(array);
        System.out.println(ret);
    }
Arrays.sort(array);   //给数组排序
    public static void main(String[] args) {
        int[] array = new int[10];
        System.out.println(Arrays.toString(array));
/*        Arrays.fill(array,99);       //整个数组 填充99
        System.out.println(Arrays.toString(array));*/
        Arrays.fill(array,3,6,99);    //从[3,6) 赋值99
        System.out.println(Arrays.toString(array));
    }

数组作为方法的返回值

  public static int[] func5(int[] array){    //并没有在原来数组的基础上上修改,而是重新把修改之后的元素放到了一个新的数组当中
        int[] ret = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            ret[i] = array[i] * 2;
        }
        return ret;
    }

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
/*        func3(array);
        System.out.println(Arrays.toString(array));
        int[] ret = func4(array);
        System.out.println(Arrays.toString(ret));*/
        int[] v = func5(array);
        System.out.println(Arrays.toString(v));
    }

4. 数组转字符串Arrays

Arrays是操作数组的工具类

实现自己的数组转字符串

public static String myToString(int[] tmp) {
        //assert tmp != null     是否可以用断言判断是否为空  TODO:提示:可能需要设置一些参数。
        if(tmp == null) return "null";
        String ret = "[";
        for (int i = 0; i < tmp.length; i++) {
            ret += tmp[i];
            if (i != tmp.length - 1) {
                ret += ",";
            }
        }
        ret += "]";
        return ret;
    }

    public static void main(String[] args) {
        int[] array = {1,2,2,4,4,4};
        String x = myToString(array);
        System.out.println(x);

5. 数组的拷贝

    public static void main(String[] args) {
        int[] array1 = {1,2,2,4,4,4};
//        int[] array2 = array1;   //不算copy,因为根本没有产生新的空间
        //自己写的拷贝
        int[] array2 = new int[array1.length];
        for (int i = 0; i < array1.length; i++) {
            array2[i] = array1[i];
        }
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
        //数组的拷贝  Arrays.copy
        int[] array3 = Arrays.copyOf(array1,array1.length);
        System.out.println(Arrays.toString(array3));

        //扩容2倍
        int[] array4 = Arrays.copyOf(array1,2*array1.length);
        System.out.println(Arrays.toString(array4));
    }

copyof源码
在这里插入图片描述
arraycopy

public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

arraycopy可以实现将一个数组的指定个数元素复制到另一个数组中。

        //局部拷贝
        int[] array1 = {1,2,2,4,4,4,5,7,7,7,9};
        int[] copy = new int[array1.length];
        System.arraycopy(array1,0,copy,3,array1.length -4);
        System.out.println(Arrays.toString(copy));

在这里插入图片描述
将array1的第0个元素,copy到copy数组中的第3个元素中,copy的元素数量为array1.length -4,也就是7个。

   //局部拷贝
        int[] array1 = {1,2,2,4,4,4,5,7,7,7,9};
        int[] array5 = Arrays.copyOfRange(array1,2,5);   //[2,5)
        System.out.println("array5"+Arrays.toString(array5));

在这里插入图片描述

克隆

        int[] array6 = array1.clone();
        System.out.println("array6"+Arrays.toString(array6));

6.数组练习

6.1 求数组中元素的平均值

    public static void main3(String[] args) {
        int[] arr = {1,2,3,4,5,6};
        System.out.println(avg(arr));
    }
    public static double avg(int[] arr) {
        int sum = 0;
        for (int x : arr) {
            sum += x;
        }
        return (double)sum / (double)arr.length;
    }

6.2 查找数组中指定元素(顺序查找)

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置

    public static int find(int[] array,int key) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == key) {
                return i;
            }
        }
        return -1;
    }

6.3 查找数组中指定元素(二分查找)

针对有序数组, 可以使用更高效的二分查找

 public static int binarySearch(int[] arr, int key){
        int left = 0;
        int right = arr.length - 1;
        while (left <= right){
            int mid = (left + right) / 2;
            if (arr[mid] < key) {
                left = mid + 1;
            }else if (arr[mid] > key) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    public static void main5(String[] args) {
        int[] array1 = {1,3,4,6,12,5,7,7,7,9};
        Arrays.sort(array1);
        System.out.println(Arrays.toString(array1));
        int index = binarySearch(array1,9);
        //Arrays.binarySearch Arrays自带的二分查找
        int index_1 = Arrays.binarySearch(array1,9);
        System.out.println(index);
        System.out.println(index_1);

    }

6.4 数组排序(冒泡排序)

给定一个数组, 让数组升序 (降序) 排序.
算法思路
假设排升序:

  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾
  2. 依次从上上述过程,直到数组中所有的元素都排列好
    public static void bubbleSort1(int[] array){
        //i控制趟数
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1; j++) {
                if (array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
    }
    public static void bubbleSort2(int[] array){
        //i控制趟数
        for (int i = 0; i < array.length - 1; i++) {
            //j < array.length - 1 - i
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                }
            }
        }
    }
    public static void bubbleSort3(int[] array){
        //i控制趟数
        //优化:检查某一趟之后,是否有序了?
        //在对某个元素进行判断前,先定义flg = false,如果存在array[j] > array[j + 1],说明发生交换,设置flg为true,
        //如果不存在交换,设置flg == false,说明程序已经有序,返回。
        for (int i = 0; i < array.length - 1; i++) {
            boolean flg = false;
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    flg = true;
                }
            }
            if (flg == false) {
                return;
            }
        }
    }

冒泡排序性能较低. Java 中内置了更高效的排序算法

Arrays.sort()

6.5 数组逆序

给定一个数组, 将里面的元素逆序排列.
思路
设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素。然后让前一个下标自增, 后一个下标自减, 循环继续即可.

 //数组逆序
    public static void reverse(int[] array){
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            int tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        int[] array1 = {1,3,4,6,12,5,7,7,7,9};
        reverse(array1);
        System.out.println(Arrays.toString(array1));
    }

6.6 将数组初始为某值

    //将数组初始为某值
    public static void main(String[] args) {
        int[] array1 = new int[10];
        Arrays.fill(array1,-1);
        System.out.println(Arrays.toString(array1));

        int[] array2 = new int[10];
        Arrays.fill(array2,2,4,-1);
        System.out.println(Arrays.toString(array2));
    }

6.7 判断数组是否相等

//判断数组是否相等
    public static void main7(String[] args) {
        int[] array1 = {1,3,4,6,12,5,7,7,7,9};
        int[] array2 = array1;
        boolean val = Arrays.equals(array1,array2);
        System.out.println(val);
    }

7.二维数组

在尝试用一维数组的Arrays.toString()对二维数组进行输出时,发现输出的是两个地址。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值