04 Java 数组

简介: 在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。2. 有序性:数组中的元素是有序的,通过下标访问。3. 不可变性:数组一旦初始化,则长度(数组中预分配的元素个数)不可变。

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


  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。


  1. 有序性:数组中的元素是有序的,通过下标访问。


  1. 不可变性:数组一旦初始化,则长度(数组中预分配的元素个数)不可变。


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



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


格式2: 元素类型  数组名[] ;


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


数组初始化


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


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


静态初始化


静态初始化就是将数组的元素放到大括号中,元素之间用逗号(,)分隔。


使用场景: 在已知数组的每一个元素内容情况下使用的,这样一次到位。

示例代码如下:


建议此种完整的形式

String[] nameArray = new String[] {"张三", "李四", "王五"};


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


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


动态初始化


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


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


image.png

数据类型默认值


数组长度虽然可以动态确定,但定了之后就不可以变。数组有一个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];


image.png


数组的内存结构


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


image.png


数组的内存结构


数组中常见的 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 里面塞值


image.png


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


参考



  • 丁振凡编著,《Java 语言程序设计(第2版)》华东交大版,2014.9



目录
相关文章
|
2月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
33 4
|
2月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
40 2
|
2月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
95 2
|
2月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
53 9
|
2月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
26 3
|
2月前
|
存储 算法 Java
Java一分钟之-数组的创建与遍历
数组作为Java中存储和操作一组相同类型数据的基本结构,其创建和遍历是编程基础中的基础。通过不同的创建方式,可以根据实际需求灵活地初始化数组。而选择合适的遍历方法,则可以提高代码的可读性和效率。掌握这些基本技能,对于深入学习Java乃至其他编程语言的数据结构和算法都是至关重要的。
31 6
|
2月前
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
34 1
|
2月前
|
存储 XML Java
如何在 Java 中将常见文档转换为 PNG 图像数组
如何在 Java 中将常见文档转换为 PNG 图像数组
18 1
|
2月前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
125 9
|
3月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
42 10