一维数组及多维数组--总结

数组

1.一维数组

1.1一维数组的概念

  • 同类型的一组数据存储到一块,有一个数组的名称用来调用,但是数组中的值是有顺序的进行管理的

  • 数组中的名词:

    • 数组名:整个容器当中只有这一个名称
    • 下标:永远从0开始,并且不改变
    • 长度:声明长度以后不可改变
  • 注意:

    • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
    • 创建数组对象会在内存中开辟一整块连续的空间。占据的空间的大小,取决于数组的长度和数组中元素的类型。
    • 数组中的元素在内存中是依次紧密排列的,有序的。
    • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改
    • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
    • 数组名中引用的是这块连续空间的首地址。
  • 使用数组:

    1. 数组声明的语法:数据类型[] 数组名称
    2. 数组初始化的语法 :
      1. 静态初始化:已经知道数组中的各个值是谁
        • 数组名称 = new 数据类型[]{x,x,x,x}
        • 数组的名称 = {x,x,x,x}
      2. 动态初始化-不知道数组的值,只知道数据的长度
        • 数组的名称 = new 数据类型[数组的长度]
        • eg:数组的长度只能写在后面new了之后的[]中
    3. 数组的长度:数组名。length是数组的一个属性,不是方法
    4. 数组元素的引用:数组名[数组的索引值] 不能超过数组的索引长度
    5. 数组的遍历:访问数组中所有的数据 for循环
    6. 数组的默认值:
    • 引用数据类型:基本数据类型的默认值为谁,那么数组中的默认值就为谁
    • 基本数据类型:基本都为null
      一维数组的遍历
public class ArrayTest4 {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println("数组的长度:" + arr.length);
//遍历输出数组中的元素
System.out.println("数组的元素有:");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
}

数组默认初始值

数组元素类型运算符
byte0
short0
int0
long0 L
float0.0F
double0.0
char0
booleanfalse
引用类行null

一维数组内存分析

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

区域名称作用
虚拟机栈用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放
堆内存存储对象(包括数组对象),new来创建的,都存储在堆内存
方法区存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据
本地方法栈当程序中调用了native的本地方法时,本地方法执行期间的内存区域
程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址

多维数组的使用

  • 对于二维数组的理解,可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
  • 其实,从数组底层的运行机制来看,其实没有多维数组

高一年级三个班级均由多个学生姓名构成一个个数组。如下:
那从整个年级看,我们可以声明一个二维数组。如下:

  • 应用举例3:
    蓝框的几个元素,可以使用一维数组来存储。但现在发现每个元素下还有下拉框,其内部还有元素,那就需要使用二
    维数组来存储:
    int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66};
    int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}};
    String[] class1 = new String[]{“段誉”,“令狐冲”,“任我行”};
    String[] class2 = new String[]{“张三丰”,“周芷若”};
    String[] class3 = new String[]{“赵敏”,“张无忌”,“韦小宝”,“杨过”};

声明与初始化

声明

//推荐
元素的数据类型[][] 二维数组的名称;
//不推荐
元素的数据类型 二维数组名[][];
//不推荐
元素的数据类型[] 二维数组名[];

静态初始化

格式:

int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1}};

定义一个名称为arr的二维数组,二维数组中有三个一维数组

  • 每一个一维数组中具体元素也都已初始化
    • 第一个一维数组 arr[0] = {3,8,2};
    • 第二个一维数组 arr[1] = {2,7};
    • 第三个一维数组 arr[2] = {9,0,1,6};
  • 第三个一维数组的长度表示方式:arr[2].length;

注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组

动态初始化

如果二维数组的每一个数据,甚至是每一行的列数,需要后期单独确定,那么就只能使用动态初始化方式了。动态初
始化方式分为两种格式:
格式1:规则二维表:每一行的列数是相同的

1)确定行数和列数

  • 元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
  • 其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
  • 此时创建完数组,行数、列数确定,而且元素也都有默认值
  • (2)再为元素赋新值
  • 二维数组名[行下标][列下标] = 值;
  • 举例:

定义了名称为arr的二维数组

  • 二维数组中有3个一维数组
  • 每一个一维数组中有2个元素
  • 一维数组的名称分别为arr[0], arr[1], arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是: arr[0][1] = 7
    格式2:不规则:每一行的列数不一样
  • (1)先确定总行数
    元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];
  • 此时只是确定了总行数,每一行里面现在是null
  • (2)再确定每一行的列数,创建每一行的一维数组
    二维数组名[行下标] = new 元素的数据类型[该行的总列数];
  • 此时已经new完的行的元素就有默认值了,没有new的行还是null
  • (3)再为元素赋值

二维数组名[行下标][列下标] = 值

举例:

int[][] arr = new int[3][

  • 二维数组中有3个一维数组。
  • 每个一维数组都是默认初始化值null (注意:区别于格式1)
  • 可以对这个三个一维数组分别进行初始化:arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
  • 注: int[][]arr = new int[][3]; //非法
package com.six;

public class array18 {
    public static void main(String[] args) {
        /*
        1
        2 2
        3 3 3
        4 4 4 4
        5 5 5 5 5
        */
        int[][] arr = new int[5][];
        //确定每一行的列数
        for (int i = 0; i < arr.length; i++) {
            /*
            arr[0] 的列数是1
            arr[1] 的列数是2
            arr[2] 的列数是3
            arr[3] 的列数是4
            arr[4] 的列数是5
            */
            arr[i] = new int[i + 1];
        }
        //确定元素的值
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = i + 1;
            }
        }
        //遍历显示
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

数组的长度和角标

  • 二维数组的长度/行数:二维数组名.length
  • 二维数组的某一行:二维数组名[行下标],此时相当于获取其中一组数据。它本质上是一个一维数组。行下标的
    范围:[0, 二维数组名.length-1]。此时把二维数组看成一维数组的话,元素是行对象。
  • 某一行的列数:二维数组名[行下标].length,因为二维数组的每一行是一个一维数组。
  • 某一个元素:二维数组名[行下标][列下标],即先确定行/组,再确定列。

二位数组的遍历

格式

 for(int i=0; i<二维数组名.length; i++){ //二维数组对象.length
  for(int j=0; j<二维数组名[i].length; j++){//二维数组行对象.length
System.out.print(二维数组名[i][j]);
}
System.out.println();
}

举例

public class Test23TwoDimensionalArrayIterate {
public static void main(String[] args) {
//存储3个小组的学员的成绩,分开存储,使用二维数组。
       int[][] scores = {
                        {85,96,85,75},
                        {99,96,74,72,75},
                        {52,42,56,75}
         };
System.out.println("一共有" + scores.length +"组成绩.");

for (int i = 0; i < scores.length; i++) {

System.out.print("第" + (i+1) +"组有" + scores[i].length + "个学员,成绩如下:");
for (int j = 0; j < scores[i].length; j++) {

System.out.print(scores[i][j]+"\t");
}

System.out.println();

     }
  }
}

内存解析

二维数组本质上是元素类型是一维数组的一维数组。

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

//1、声明一个二维数组,并且确定行数
//因为每一行的列数不同,这里无法直接确定列数
int[][] arr = new int[5][];
//2、确定每一行的列数
for(int i=0; i<arr.length; i++){
/*
arr[0] 的列数是1
arr[1] 的列数是2
arr[2] 的列数是3
arr[3] 的列数是4
arr[4] 的列数是5
*/
arr[i] = new int[i+1];
}
//3、确定元素的值
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr[i].length; j++){
arr[i][j] = i+1;

数组的常见算法

数值型数组特征值统计

  • 平均值,最大值,最小值,总和等
package com.six;

public class array14 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = +arr[i];

        }
        double avg = (double) sum / arr.length;
        System.out.println("sum=" + sum);
        System.out.println("avg=" + avg);
    }
}

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

        long result = 1;
        for (int i = 0; i < arr.length; i++) {
            result *= arr[i];
        }
        System.out.println("result=" + result);
    }
}

class array21 {
    public static void main(String[] args) {
        int[] arr = {4, 5, 6, 1, 9};
//统计偶数个数
        int evenCount = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                evenCount++;
            }
        }
        System.out.println("evenCount = " + evenCount);
    }
}

class TestArrayMax {
    public static void main(String[] args) {
        int[] arr = {4, 5, 6, 1, 9};
        //找最大值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {//此处i从1开始,是max不需要与arr[0]再比较一次了
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("max = " + max);
    }
}
class array22 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        //找最大值,及下标
        int max = arr[0];
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
                index = i;
            }
        }
        System.out.println("max = " + max);
        System.out.println("index = " + index);
    }
}
 class array23 {
    //找最值及其所有最值的下标
    public static void main(String[] args) {
        int[] arr = {4,5,6,1,9,9,3};
        //找最大值
        int max = arr[0];
        String index = "0";
        for(int i=1; i<arr.length; i++){
            if(arr[i] > max){
                max = arr[i];
                index = i + "";
            }else if(arr[i] == max){
                index += "," + i;
            }
        }
        System.out.println("最大值是" + max);
        System.out.println("最大值的下标是[" + index+"]");
    }
 }
 class array24 {
    //分析以下需求,并用代码实现:
    //(1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3
    //(2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值分析以下需求,并用代码实现:
       public static void main(String[] args) {
        int[] scores = {5,4,6,8,9,0,1,2,7,3};

        int max = scores[0];
        int min = scores[0];
        int sum = 0;
        for (int i = 0; i < scores.length; i++) {
            if(max < scores[i]){
                max = scores[i];
            }
            if(min > scores[i]){
                min = scores[i];
            }
            sum += scores[i];
        }
        double avg = (double) (sum-max-min) / (scores.length-2);
           System.out.println("选手去掉最高分和最低分之后的平均分为:" + avg);
    }
 }

数组元素的赋值与数组复制

举例2:使用简单数组

package com.six;

public class array25 {
    public static void main(String[] args) {
        /*
        (1)在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。
        (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。
        (3)显示array1的内容。
        (4)赋值array2变量等于array1,修改array2中的偶索引元素,
        使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。  array2 = array1;
         */
        int[] array1 = {2, 3, 5, 7, 11, 13, 17, 19};
        int[] array2;
        int[] array3;

        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1[i] + "\t");
        }
        array2 = array1;
        for (int i = 0; i < array2.length; i++) {
            if (i % 2 == 0) {
                array2[i] = i;
            }
        }
        System.out.println();

        array3 = new int[array1.length];//存储位置改变
        for (int i = 0; i < array3.length; i++) {
            array3[i] = array1[i];
        }
        //遍历更改之后的array1的值
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + "\t");
        }

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

        System.out.println(array1);
        System.out.println(array2);
        System.out.println(array3);
    }
}

举例6:回形数
从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。

举例6:回形数
从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
--------------------------
package com.six;

public class array27 {
    public static void main(String[] args) {
        /*
        01 02 03 04 05 06 07
        24 25 26 27 28 29 08
        23 40 41 42 43 30 09
        22 39 48 49 44 31 10
        21 38 47 46 45 32 11
        20 37 36 35 34 33 12
        19 18 17 16 15 14 13
        */
        int n = 7;
        int[][] arr = new int[n][n];

        int count = 0;
        int maxX = n - 1;
        int maxY = n - 1;
        int minX = 0;
        int minY = 0;
        while (minX <= maxX) {
            for (int x = minX; x <= maxX; x++) {
                arr[minY][x] = ++count;
            }
            minY++;
            for (int y = minY; y <= maxY; y++) {
                arr[y][maxX] = ++count;
            }
            maxX--;
            for (int x = maxX; x >= minX; x--) {
                arr[maxY][x] = ++count;
            }
            maxY--;
            for (int y = maxY; y >= minY; y--) {
                arr[y][minX] = ++count;
            }
            minX++;
        }
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                String space = (arr[i][j] + "").length() == 1 ? "0" : "";
                System.out.print(space + arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}


数组元素的反转

  • 实现思想:数组对称位置的元素互换。
package com.six;

public class array28 {
    public static void main(String[] args) {
        // 数组元素的反转
        //实现思想:数组对称位置的元素互换
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println("反转之前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
        //反转
         /*
         思路:首尾对应位置的元素交换
         (1)确定交换几次
         次数 = 数组.length / 2
         (2)谁和谁交换
         for(int i=0; i<次数; i++){
         int temp = arr[i];
         arr[i] = arr[arr.length-1-i];
         arr[arr.length-1-i] = 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("反转之后");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }

    }
}
class array29 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println("反转之前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
        //反转
        //左右对称位置交换
        for(int left=0,right=arr.length-1; left<right; left++,right--){
        //首 与 尾交换
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
        System.out.println("反转之后:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
    }
}

数组的扩容与缩容

数组的扩容与缩容

  • 数组的扩容

题目:现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,并将10,20,30三个数据添加到arr数组中,如何
操作?

  • 数组的缩容

题目:现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素

package com.six;

//public class array30 {
//    public static void main(String[] args) {
//        //题目:现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,
//        // 并将10,20,30三个数据添加到arr数组中,如何
//        //操作?
//        int[] arr = new int[]{1, 2, 3, 4, 5};
//        int[] newArr = new int[arr.length + 3];
//        for (int i = 0; i < arr.length; i++) {
//            newArr[i] = arr[i];
//        }
//
//        newArr[arr.length] = 10;
//        newArr[arr.length + 1] = 20;
//        newArr[arr.length + 2] = 30;
//
//        arr = newArr;
//
//        for (int i = 0; i < arr.length; i++) {
//            System.out.print(arr[i]);
//        }
//    }
//}

class array31 {
    public static void main(String[] args) {
        //现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素
        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
        //删除数组中索引为4的元素
        int delIndex = 4;
        //方案1:
        //创建新数组
        int[] newArr = new int[arr.length - 1];
        for (int i = 0; i < delIndex; i++) {
            newArr[i] = arr[i];
        }
        for (int i = delIndex; i < arr.length; i++) {
            newArr[i - 1] = arr[i];
        }
        arr = newArr;
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

class array32 {
    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
        //删除数组中索引为4的元素
        int delIndex = 4;
        for (int i = delIndex; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr[arr.length - 1] = 0;
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

数组的元素查找

顺序查找yu二分查找

  • 顺序查找:挨个查看
  • 要求:对数组元素的顺序没要求
package com.six;

public class array33 {
    public static void main(String[] args) {
        //顺序查找:挨个查看
        //要求:对数组元素的顺序没要求
        int[] arr = {4,5,6,1,9};
        int value = 1;
        int index = -1;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == value) {
                index = i;
                break;
            }

        }
        if(index==-1){
            System.out.println(value + "不存在");
        }else{
            System.out.println(value + "的下标是" + index);
        }
    }
}
class array34 {
    public static void main(String[] args) {
        //二分法查找:要求此数组必须是有序的。
        int[] arr3 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
        boolean isFlag = true;
        int value = 256;
//int value = 25;
        int head = 0;//首索引位置
        int end = arr3.length - 1;//尾索引位置
        while (head <= end) {
            int middle = (head + end) / 2;
            if (arr3[middle] == value) {
                System.out.println("找到指定的元素,索引为:" + middle);
                isFlag = false;
                break;
            } else if (arr3[middle] > value) {
                end = middle - 1;
            } else {//arr3[middle] < value
                head = middle + 1;
            }
        }
        if (isFlag) {
            System.out.println("未找打指定的元素");

        }
    }
}

数组元素排序

算法概述

  • 定义
    • 排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新
      排序为{Ri1,Ri2,…,Rin},使得相应的关键字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序。
    • 通常来说,排序的目的是快速查找。
  • 衡量排序算法的优劣:
    • 时间复杂度 :分析关键字的比较次数和记录的移动次数
    • 常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<
      Ο(n!)<O(nn)
    • 空间复杂度 :分析排序算法中需要多少辅助内存

    一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函

    • 稳定性 :若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳
      定的。

冒泡排序(Bubble Sort)

排序思想:

  1. 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止
    动态演示:https://visualgo.net/zh/sorting?slide=6-9

快速排序

快速排序(Quick Sort)由 图灵奖 获得者 Tony Hoare 发明,被列为 20世纪十大算法之一 ,是迄今为止所有内排序算
法中速度最快的一种,快速排序的时间复杂度为O(nlog(n))。
快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试
面试中能经常看到快排的影子。
排序思想:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可
    以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算
    法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
    动态演示: https://visualgo.net/zh/sorting

内部排序性能比较与选择

  • 性能比较
    • 从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
    • 从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。
      对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
    • 从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆
      排序是不稳定排序
    • 从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
  • 选择
    • 若n较小(如n≤50),可采用直接插入或直接选择排序。
      当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排
      序为宜。
    • 若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
    • 若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序

Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。 比如:

  • 数组元素拼接
    • static String toString(int[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用
      字符 ", "(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。]
    • static String toString(Object[] a) :字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元
      素用字符 ", "(逗号加空格)分隔。元素将自动调用自己从Object继承的toString方法将对象转为字符串进行
      拼接,如果没有重写,则返回类型@hash值,如果重写则按重写返回的字符串进行拼接。
  • 数组排序
    • static void sort(int[] a) :将a数组按照从小到大进行排序
    • static void sort(int[] a, int fromIndex, int toIndex) :将a数组的[fromIndex, toIndex)部分按照升序排列
    • static void sort(Object[] a) :根据元素的自然顺序对指定对象数组按升序进行排序。
    • static void sort(T[] a, Comparator<? super T> c) :根据指定比较器产生的顺序对指定对象数组进行排序。
      数组元素的二分查找
      static int binarySearch(int[] a, int key) 、static int binarySearch(Object[] a, Object key) :要求数组有序,在数
      组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数。
  • 数组的复制
    • static int[] copyOf(int[] original, int newLength) :根据original原数组复制一个长度为newLength的新数组,
      并返回新数组
    • static T[] copyOf(T[] original,int newLength):根据original原数组复制一个长度为newLength的新数组,并返
  • 回新数组
    • static int[] copyOfRange(int[] original, int from, int to) :复制original原数组的[from,to)构成新数组,并返回新
      数组
      static T[] copyOfRange(T[] original,int from,int to):复制original原数组的[from,to)构成新数组,并返回新数

      比较两个数组是否相等
    • static boolean equals(int[] a, int[] a2) :比较两个数组的长度、元素是否完全相同
    • static boolean equals(Object[] a,Object[] a2):比较两个数组的长度、元素是否完全相同
      填充数组
    • static void fill(int[] a, int val) :用val值填充整个a数组
    • static void fill(Object[] a,Object val):用val对象填充整个a数组
    • static void fill(int[] a, int fromIndex, int toIndex, int val):将a数组[fromIndex,toIndex)部分填充为val值
    • static void fill(Object[] a, int fromIndex, int toIndex, Object val) :将a数组[fromIndex,toIndex)部分填充为val对

      举例
观察一下代码,运行后会出现什么结果。
import java.util.Arrays;
public class SortTest {
public static void main(String[] args) {
int[] arr = {3, 2, 5, 1, 6};
System.out.println("排序前" + Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("排序后" + Arrays.toString(arr));
}
}

数组中的常见异常

数组角标越界异常
当访问数组元素时,下标指定超出[0, 数组名.length-1]的范围时,就会报数组下标越界异常

public class TestArrayIndexOutOfBoundsException {
public static void main(String[] args) {
int[] arr = {1,2,3};
// System.out.println("最后一个元素:" + arr[3]);//错误,下标越界
// System.out.println("最后一个元素:" + arr[arr.length]);//错误,下标越界
System.out.println("最后一个元素:" + arr[arr.length-1]);//对
}
}

空指针异常

public class TestNullPointerException {
public static void main(String[] args) {
//定义数组
int[][] arr = new int[3][];
System.out.println(arr[0][0]);//NullPointerException
}
}
  • 小结

//举例一:
// int[] arr1 = new int[10];
// arr1 = null;
// System.out.println(arr1[9]);
//举例二:
// int[][] arr2 = new int[5][];
// //arr2[3] = new int[10];
// System.out.println(arr2[3][3]);
//举例三:
String[] arr3 = new String[10];
System.out.println(arr3[2].toStri

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值