Java中的数组(续)

文章目录:

前言:

一、操作数据工具类Arrays与数组练习

1.1数组转字符串

1.2数组的拷贝

[1.3 查找数组中指定元素(顺序查找)](#1.3 查找数组中指定元素(顺序查找))

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

1.5数组排序(冒泡排序)

4.6数组逆序

二、二维数组

[2.1 普通的二维数组](#2.1 普通的二维数组)

[2.2 不规则的二维数组](#2.2 不规则的二维数组)

总结:



前言:

上篇文章讲述数组的基本框架,这篇将进一步学习java中的数组


一、操作数据工具类Arrays与数组练习

1.1数组转字符串

java 复制代码
        int[] array = {1, 2, 3, 4};
        System.out.println(Arrays.toString(array));

结果为:

使用这个方法后续的打印数组会更便捷.

JAVA中提供java.util.Arrays包,其中包含一些操作数组的方法。

1.2数组的拷贝

自己版本的拷贝数组的写法:

java 复制代码
        int[] array1 = new int[]{1,2,3,4};
        int[] array2 = new int[array1.length];

        System.out.println("拷贝前:"+Arrays.toString(array1));
        System.out.println("拷贝前:"+Arrays.toString(array2));

        for (int i = 0; i <array1.length ; i++) {
            array2[i] = array1[i];

        }
        System.out.println("==========");
        System.out.println("拷贝后:"+Arrays.toString(array1));
        System.out.println("拷贝后:"+Arrays.toString(array2));

结果为:

需要注意的是,数组的拷贝指的是创建一个新数组,将需要拷贝的值拷贝到新数组中。

java 复制代码
        int[] array = new int[]{1,2,3,4};
        int[] newarray= Arrays.copyOf(array, array.length);
        System.out.println(Arrays.toString(newarray));

结果为:


copyOf(int[] original, int newLfan)

​​​使用Arrays.copyof方法完成数组的拷贝:

coypof方法在进行数组拷贝时,创建了一个新的数组。

array和newarray引用的不是一个数组

规定范围进行拷贝

java 复制代码
        int[] array = new int[]{1,2,3,4};
        int[] arr=Arrays.copyOfRange(array,1,3);
        System.out.println(Arrays.toString(arr));

结果为


copyOfRange(int[] original, int from, int to)

java中from ... to ... 的取值范围是[ ),无法取到右边的数

注意

数组当中存储的是基本数据类型时,不论怎么拷贝基本都不会出现问题,但如果存储的时引用数据类型,拷贝时需要考虑深浅拷贝的问题。后续会涉及。

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

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

代码示例:

java 复制代码
   public static int fuc(int[] array,int data) {
        for (int i = 0; i <array.length ; i++) {
            if (array[i]==data){
                return i;
            }
        }
        return -1;

    }
    public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        int data = 4;
        System.out.println(fuc(array, data));
    }

结果为:

将匹配到的值的下标进行打印

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

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

以升序数组为例,二分查找的思路是先取中间位置的元素,然后使用待查找元素与中间元素进行比较;

  • 如果相等,即找到了返回该元素在数组的下标
  • 如果小于,以类似方法到数组左半侧查找
  • 如果大于,以类似方法到数组右半侧查找
java 复制代码
   public static void main(String[] args) {
        int[] array = new int[]{1,2,3,4,5};
        int data= 5;
        int ret = binarySearch(array, data);
        if (ret==-1){
            System.out.println("没有找到值");
        }else {
            System.out.println(ret);
        }
    }
    //二分查找
    public static int binarySearch(int[] array,int data){
        int i = 0;
        int j =array.length-1;

        while(i<=j){
            int mid = (i+j)/2;
            if(array[mid]>data){
                j = mid -1;
            } else if (array[mid]<data) {
                i = mid +1;
            }else{
                return i;
            }
        }
        return -1;
    }

当针对一个长度为1000个元素的数组查找,二分查找只需要循环14次就能完成循环。

随着数组元素个数越多,二分的优势就越大。

利用工具**Array.binarySearch(int [ ] a , int key)**进行二分查找

注意:数组元素要有序

java 复制代码
        //利用工具进行二分查找
        int[] array = new int[]{1,2,3,4,5};
        int ret = Arrays.binarySearch(array, 5);
        System.out.println(ret);

结果为:

1.5数组排序(冒泡排序)

给定一个数组,让数组升序(降序)排列

假设拍升序:

将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾

依次从上上述过程,直到数组中所有的元素都排列好

代码:

java 复制代码
 public static void bubbleSort(int[] array){
        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+1]<array[j]){
                    int tmp = array[j+1];
                    array[j+1]=array[j];
                    array[j]=tmp;
                    flg = true;
                }
            }
            if (!flg){
                break;
            }
        }
    }
    public static void main(String[] args) {
        int[] array = {1,10,9,5,6};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }

结果为:

上述冒泡排序进行了两次的优化。

  1. j<array.length-1-i: 让 j 在每i次的排序中都少1一次
  2. if(!flg):当flg为false时,表示没有进入if语句------》序列有序,进而break循环,避免后续的无效循环,从而优化程序。

冒泡排序性能较低。

JAVA中内置了更高效的排序算法:

利用工具**Arrays.sort(int[] a)**将数组进行排序

代码:

java 复制代码
        int[] array = new int[]{1,22,31,44,5,8};
        // 1 5 8 22 31 44
        System.out.println("排序前"+Arrays.toString(array));
        Arrays.sort(array);
        System.out.println("排序后"+Arrays.toString(array));

结果为:

4.6数组逆序

给定一个数组,将里面的元素逆序排列

设定两个下标,分别指向第一个元素和最后一个元素,交换两个位置的元素

然后让前一个下标自增,后一个下标自减,进行循环。

代码为:

java 复制代码
 public static void reverse(int[] array){
        int i = 0;
        int j =array.length-1;
        while(i<j){
            int tmp = array[i];
            array[i]= array[j];
            array[j] = tmp;
            i++;
            j--;
        }

    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        reverse(array);
        System.out.println(Arrays.toString(array));
        
    }

结果为:

二、二维数组

2.1 普通的二维数组

二维数组本质上也就是一维数组,只不过每个元素又是一个一维数组.

基本语法:

数据类型[ ] [ ] 数组名称 = new 数据类型 [ ] [ ] {初始化数据}

行不可以省略,列可以省略

代码示例:

java 复制代码
        int[] [] array = new int[][]{{1,2,3,},{4,5,6}};

        int[] [] array2 ={{1,2,3,},{4,5,6,}};

        int[] [] array1 = new int[2][3]; //0

二维数据直观图:

二维数组内存存储:

栈上引用存储堆上行数的地址,通过下标访问二维数组元素具体的值。

其中:

java 复制代码
 int[][] array = {{1,2,3},{4,5,6}};

        System.out.println(array.length);
        System.out.println(array[0]);
        System.out.println(array[0].length);
    }

打印结果为:

array.length的长度是二维数组的行数

array.[ 0 ]中存储着二维数组第一行首元素的地址

array[0].length为二维数组第一行的长度

进行二维数组的打印:

java 复制代码
int[][] array = {{1,2,3},{4,5,6}};

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }

结果为:

同时,JAVA中存在工具直接对二维数组以字符串进行时进行打印:

deepToString(Object[] a)

java 复制代码
 int[][] array = {{1,2,3},{4,5,6}};
        System.out.println(Arrays.deepToString(array));

结果为:

2.2 不规则的二维数组

java 复制代码
  int[][] array = new int[2][];
        array[0]= new int[]{1,2,3,4,5};
        array[1]=new int[3];
        System.out.println(Arrays.deepToString(array));

只定义行数时,利用array[ 下标 ]确定列数。

结果为:

现阶段较少使用。


总结:

需要知道些工具:Arrays类的些方法

在这些方法中利用ideal可以看到重载。

二分查找:binarySearch(Object[] a, Object key)

binarySearch(Object[] a, int fromIndex, int toIndex, Object key)

复制:copyOf(int[] original, int newLength)

copyOfRange(int[] original, int from, int to)

比较数组是否相同:equals(int[] a, int[] a2)

java 复制代码
 int[] array = {1,2,3};
        int[] array1 = {1,2,3};
        Boolean ret = Arrays.equals(array, array1);
        System.out.println(ret);

------》return boolean

填充:fill(int[ ] a, int fromIndex, int toIndex, int val)

java 复制代码
int[] array = new int[10];
        Arrays.fill(array,2,5,-1); // [2,6)
        System.out.println(Arrays.toString(array));

排序: sort(int[] a)

一维数组打印:toString(int[] a)

二维数组打印:deepToString(Object[] a)

相关推荐
zzzsde3 小时前
【C++】C++11(1):右值引用和移动语义
开发语言·c++·算法
学困昇3 小时前
C++11中的包装器
开发语言·数据结构·c++·c++11
讨厌下雨的天空3 小时前
Linux信号量
java·开发语言
♡喜欢做梦4 小时前
MyBatis XML 配置文件:从配置规范到 CRUD 开发实践
xml·java·java-ee·mybatis
爱吃烤鸡翅的酸菜鱼4 小时前
Spring Boot 实现 WebSocket 实时通信:从原理到生产级实战
java·开发语言·spring boot·后端·websocket·spring
J不A秃V头A4 小时前
Maven的分发管理与依赖拉取
java·maven
雪域迷影4 小时前
C++中编写UT单元测试用例时如何mock非虚函数?
开发语言·c++·测试用例·gmock·cpp-stub开源项目
AI街潜水的八角5 小时前
Python电脑屏幕&摄像头录制软件(提供源代码)
开发语言·python
hadage2335 小时前
--- git 的一些使用 ---
开发语言·git·python