Java基础 | 数组

Java基础 | 数组

数组的特点

  1. 数组 Array 是多个相同类型的数据按一定顺序排列的集合,并使用一个名字命名,通过索引的方式对数组元素统一管理
  2. 数组属于引用数据类型,而数组的元素可以是基本数据类型,也可以是引用数据类型
  3. 创建数组对象会在堆内存中开辟一整块连续的空间
  4. 数组的长度 length 一旦确定就不可修改
  5. 数组和其他引用数据类型一样,既可以作为方法的参数,也可以作为方法的返回值

一维数组

  1. 声明与初始化
// new 的作用就是在堆内存中开辟一块连续的空间,用于存储对象实体

// 方法1,静态初始化:数组初始化和元素赋值同时进行
int[] arr1 = new int[]{1,2,3,4,5};

// 方法2,动态初始化:数组初始化和元素赋值分开进行
String[] arr2 = new String[5]; 

// 其他正确的方式
int[] arr3 = {1,2,3,4,5}; // 省略new int[]
int[] arr4; // 声明一个int数组,arr是一个尚未初始化的局部变量
arr4 = new int[5]; // 初始化数组 arr4

// 错误的方式
// int[] arr1 = new int[]; // 动态初始化不可不指明长度
// int[5] arr2 = new int[5]; // 左边 int[] 指明arr2是int数组,不可在[]内指明长度
// int[] arr3 = new int[3]{1,2,3}; // 静态初始化不可指定长度
  1. 长度
    数组长度 length 表示数组的大小,即最多能够容纳多少个元素,数组一旦初始化,其长度就不能改变。
System.out.println(arr2.length); // 5
  1. 索引
    数组元素的索引从 0 开始,到 length-1 结束
for(int i=0;i<arr.length;i++) {
    System.out.println(arr[i]);
}
  1. 元素的默认初始化
元素类型默认初始化值
整型0
浮点型0.0
char'\u0000'(不是'0')
booleanfalse
引用数据类型null

二维数组

如果一个一维数组 A 的元素依然是一维数组,则该数组 A 就是二维数组

  1. 声明与初始化
// 静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};

// 动态初始化1:同时指定第一维和第二维的长度
String[][] arr2 = new String[3][2];

// 动态初始化2:只指定第一维的长度
String[][] arr3 = new String[3][];

// 其他正确的方式
int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};

// 错误的方式
// String[][] arr4 = new String[][4];
// String[4][3] arr5 = new String[][];
// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
  1. 长度

第一维和第二维的长度可以不相同

System.out.println(arr1.length); // 3
System.out.println(arr1[0].length); // 3
System.out.println(arr1[1].length); // 2
  1. 索引
System.out.println(arr1[0][1]); // 2
System.out.println(arr2[1][1]); // null
  1. 元素的默认初始化

二维数组第一维的元素为外层元素,第二维的元素为内层元素

int[][] arr1 = new int[3][4];
// 对于上面这种初始化方式
// 外层元素初始化为地址值,因为第二维已经开辟了空间 
// 内层元素初始化规则与一维数组相同

int[][] arr2 = new int[3][4];
// 对于上面这种初始化方式
// 外层元素初始化为地址值,因为第二维已经开辟了空间 
// 内层元素初始化规则与一维数组相同

Arrays 工具类

java.util.Arrays 类提供了很多操作数组的方法。

  1. public static boolean equals(Object[] obj1,Object[] obj2)
    通过数组元素的 equals() 方法比较数组中对应位置的元素是否相等,也就是基于内容比较

  2. public static String toString(Object[] obj)
    返回指定数组的内容的字符串表示形式

  3. public static void fill(Object[] obj,Object val)
    用指定元素填充指定的数组

  4. public static void fill(Object[] obj, int fromIndex, int toIndex, Object val)
    用指定元素填充指定的数组,并指定填充的起止索引(左闭右开)

  5. public static void sort(Object[] obj)
    对数组进行升序排序

  6. public static int binarySearch(Object[] obj,Object key)
    对数组进行二分查找,如果找到返回元素下标,如果没有找到返回-1

其他常用方法

java.lang.System 下的 arraycopy 方法

  1. public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  • src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目的地数据中的起始位置。
    length - 要复制的数组元素的数量。
  • 效率比 for 循环高
  • 浅拷贝:只复制对象的引用,不复制对象本身
  • 拷贝的数组和原数组的数据类型必须相同

其他

  • 数组相对于 ArrayList,效率高,但是灵活度不够
  • 优先使用容器,在性能成为瓶颈的时候考虑使用数组
  • 数组常见的异常有
    • ArrayIndexOutOfBoundsException 下标越界
    • NullPointerException 空指针异常

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://yzt.cool/archives/2020-02-25-javaarray