04 Java 数组

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:

  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
  2. 有序性:数组中的元素是有序的,通过下标访问。
  3. 不可变性:数组一旦初始化,则长度(数组中预分配的元素个数)不可变。

一维数组: 声明数组,创建数组空间,初始化三步.

格式1: 元素类型[] 数组名(推荐采用) ;
格式2: 元素类型 数组名[] ;

数组元素的类型可以是基本类型,也可以是类或接口。

数组初始化

声明完成就要对数组进行初始化,数组初始化的过程就是为数组每一个元素分配内存空间,并为每一个元素提供初始值。初始化之后数组的长度就确定下来不能再变化了。

数组初始化可以分为静态初始化和动态初始化。

静态初始化

静态初始化就是将数组的元素放到大括号中,元素之间用逗号(,)分隔。
使用场景: 在已知数组的每一个元素内容情况下使用的,这样一次到位。
示例代码如下:

建议此种完整的形式

String[] nameArray = new String[] {"张三", "李四", "王五"}; 
// 简写形式
String[] nameArray = {"张三", "李四", "王五"}; 

注意:如果在返回的时候使用简写形式,会编译不通过, return {"张三","李四","王五"}。这种情况系只能写全称。

动态初始化

动态初始化使用 new 运算符分配指定长度,系统会自动分配初始值。语法如下:new 元素数据类型[数组长度] ;

new 分配数组内存空间后,和类的成员变量的规则保持一致, 不同类型都会有默认值,如下图。

数据类型默认值

数组长度虽然可以动态确定,但定了之后就不可以变。数组有一个length属性,但只能读,不能改。还有一个小细节,不能在给定初始值的同时给定长度,即如下格式是不允许的:

// 简写形式
String[] nameArray = new String[3] {"张三", "李四", "王五"}; 

以这么理解,因为初始值已经决定了长度,再给个长度,如果还不一致,计算机将无所适从。

对 length 的理解:由于 length 的类型为 int 类型,理论上可以表示的最大长度是 int 类型的最大值。但是这样做在运行行可能会抛出 OOM 异常。实际上一般也用不到长度这么长的数组。

length 的长度要求是非负数。所以长度至少为 0. 而长度为 0 的数组称为空数组在实际生产中也有其特殊用途。

多维数组

二维数组声明

当数组中每个元素又可以带有多个下标时,这种数组就是“多维数组”。
Java中声明二维数组需要有两个中括号,具体有三种语法如下:

元素数据类型[][] 数组变量名;
元素数据类型 数组变量名[][];
元素数据类型[] 数组变量名[];

二维数组的初始化

二维数组的初始化也可以分为静态初始化和动态初始化。

静态初始化

int[][] intArray = new int[][] { { 1, 2, 3 }, { 11, 12, 13 }, { 21, 22, 23 }};

提示 严格意义上说 Java 中并不存在真正意义上的多维数组,只是一维数组,不过数组中的元素也是数组,以此类推三维数组就是数组的数组的数组了,例如{ { {1, 2}, {3} }, { {21}, {22, 23} } }表示一个三维数组。

动态初始化

语法: new 元素数据类型[高维数组长度] [低维数组长度];

不规则数组

由于 Java 多维数组是数组的数组,因此会衍生出一种不规则数组
动态初始化不规则数组比较麻烦,不能使用 new int[4][3]语句,而是需要先初始化较高维数组,然后再分别逐个初始化低维数组。代码如下:

int xxxArray[][] = new int[4][]; //先初始化高维数组为 4
//逐一初始化低维数组
xxxArray[0] = new int[2];
xxxArray[1] = new int[1];
xxxArray[2] = new int[3];
xxxArray[3] = new int[3];

数组的内存结构

数组类型和基本类型是有明显不同的,一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块:一块用于存储数组内容本身,另一块用于存储内容的位置。

数组的内存结构

数组中常见的 Exception:

  • 访问到不存在的角标: ArrayIndexOutOfBoundsException

foreach 关键字

jdk1.5 新增的关键字, 可用于数组, 集合类型的遍历. 隐藏了下标, 数组遍历强烈建议使用. 除非是需要下标值.

foreach - iterate over an array or Iterable

for (类型 变量: 数组) {}

工具类Arrays 的使用

数组拷贝由 java.lang.System 的静态方法

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

// 数组打印
Arrays.toString(array);
和 Arrays.deepToString

// 升序排列
Arrays.sort(array);

数组的赋值
Arrays.copyOf
Arrays.copyOfRange

数组元素的折半查找
binarySearch(Object[] a, Object key)

小案例

    public static void main(String[] args) {
        int[] array = { 1, 5, 3 };
        int[] bArray = { 11, 55, 33 };

        // 数组拷贝
        System.arraycopy(array, 1, bArray, 1, 1);
        System.out.println(Arrays.toString(bArray));

        // 数组打印
        System.out.println(Arrays.toString(array));

        // 升序排列
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }

命令行参数

Java 的 main 方法中有一个字符串数组,这里可以往 String[] args 里面塞值

或者通过 java Demo hello world进行塞值操作。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 5,513评论 0 9
  • 《Java从小白到大牛》纸质版已经上架了!!! 在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有...
    tony关东升阅读 3,538评论 0 0
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 9,561评论 2 13
  • 一、数组数组是一组使用数字索引的对象,这些对象属于同一种类型。虽然C#为创建数组提供了直接的语言支持,但通用类型系...
    CarlDonitz阅读 3,957评论 0 1
  • 初涉古典文学,如同身处极为宽广的海洋,不知身在何处,也不知将去往何处。 虽然有幸得一叶小舟,却无奈两手空空,不知如...
    明媚月光阅读 3,843评论 3 6