--- title: "03-完整的java数组操作应用知识汇总" created: 2025-12-02 tags: - Java --- # 完整的java数组操作应用知识汇总 > [!note] 本篇定位 > 专题深挖与资料:备忘单、反射深入、数组汇总、XML 解析、书籍推荐等 10 篇。本篇:**完整的java数组操作应用知识汇总**。正文为教程原貌(原话只增不改),代码块语言标记已补全。 数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:java是纯面向对象的语言,它的数组也是一个对象。所以很多人就按照一个对象的方式来使用数组,后来你会发现,将数组作为一个类来使用在实现上是多么的“不自然”。下面就来全面了解一下关于java中数组的知识。 ![[ct3y0hrn-7e5ecdd6.jpeg]] ## 什么是数组 数组是同一种类型数据的集合,其实就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么。不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素,数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。 ## 数组的特点 1.在Java中,无论使用数组或集合,都有边界检查。如果越界操作就会得到一个RuntimeException异常。 2.数组只能保存特定类型。数组可以保存原生数据类型,集合则不能。集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身。 3.集合类只能保存对象的引用。而数组既可以创建为直接保存原生数据类型,也可以保存对象的引用。在集合中可以使用包装类(Wrapper Class),如Integer、Double等来实现保存原生数据类型值。 4.对象数组和原生数据类型数组在使用上几乎是相同的;唯一的区别是对象数组保存的是引用,原生数据类型数组保存原生数据类型的值。 ```java int a = 10; Integer integer = new Integer(a); int b = integer.intValue(); ``` ## 数组的正确使用 如果需要存储大量的数据,例如如果需要读取100个数,那么就需要定义100个变量,显然重复写100次代码,是没有太大意义的。如何解决这个问题,Java语言提供了数组(array)的数据结构,是一个容器可以存储相同数据类型的元素,可以将100个数存储到数组中。这时候数组就有很大的帮助了~ ## 数组的格式 格式一: 元素类型[]数组名 = new元素类型[元素个数或数组长度]; ```java int[] arr = new int[5]; arr[0] = 1; ``` 格式二: 元素类型[]数组名 = new元素类型[]{元素,元素,……}; ```java int[] arr = new int[]{3,5,1,7}; ``` **注意:**给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。可以使用length属性获取数组的大小。 ## 声明数组变量 为了使用数组必须在程序中声明数组,并指定数组的元素类型=左半部分: 先写左边明确了元素类型 是int ,容器使用数组,那么如何来标识数组?.那么用一个特殊的符号[]中括号来表示。想要使用数组是需要给数组起一个名字的,那么我们在这里给这个数组起名字为arr .接着跟上等号。 代码体现: ```java String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"}; ``` **注意:**int arr[] 也是一种创建数组的格式。推荐使用int [] arr 的形式声明数组。 ## 创建数组的三种方式及区别 ```java public static void main(String[] args) { // 1.方式一 声明 分配空间并赋值 int[] arr1 = {1,2,3}; // 2.方式二 显示初始化 int[] arr2; arr2 = new int[]{1,2,3}; // 3.方式三 显示初始化() int[] arr3; arr3 = new int[3]; } ``` 他们的区别,方式一:在声明的时候直接就已经分配空间,并赋值,方式一是不能写成如下这种形式的。 ```java int[] arr1; arr1 = {1,2,3};//错误写法 编译不通过 ``` 方式二和方式三,声明和内存分配是分开的,如上面的例子, ```java int[] arr2; 和 int[] arr3; ``` 这一步是在栈空间分配一个引用,存放的是一个引用,null ```java arr2 = new int[]{1,2,3};arr3 = new int[3]; ``` 到这一步的时候jvm才开始在内存堆区域分配空间,并赋值,方式二直接赋值 1,2,3 方式三 默认初始化,基本类型是 0 布尔类型是 false 引用类型为null, **注:**内存一旦分配不能改变,所有说数组长度固定 ![[b683qb8g-40116966.jpeg]] ## 数组初始化 方式一:不使用运算符new ```java int[]arr = { 1, 2, 3, 4, 5 }; ``` 方式二:使用运算符new ```java int[] arr2 = new int[] { 1, 2, 3, 4, 5 }; int[] arr3=new int[3]; arr3[0]=1; arr3[1]=5; arr3[2]=6; ``` 如果数组初始化中不使用运算符new。需要注意:下列写法是错误的。 ```java int[] arr; arr={1,2,3,4,5}; ``` 此时初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。 所以只能如下写: ```java int[] arr={1,2,3,4,5}; ``` ## java.util.Arrays Arrays类是一个非常有用数组工具类,里面有很多工具方法,检索、填充、排序、比较、toString()等。 下面给个例子: ```java import java.util.Arrays; /** * 数组综合测试 * * @author leizhimin 2009-7-28 12:35:41 */ public class TestArrays { public static void main(String[] args) { int[] i = new int[10]; //填充数组 Arrays.fill(i, 2); //遍历数组 for (int x : i) { System.out.print(x + " "); } //toString()数组 System.out.println("\n" + Arrays.toString(i)); //复制数组 int[] b = new int[12]; System.arraycopy(i, 0, b, 2, 5); System.out.println(Arrays.toString(b)); //一维数组的比较 int[] c = new int[3]; int[] d = new int[3]; Arrays.fill(c, 3); Arrays.fill(d, 3); System.out.println(c.equals(d)); System.out.println(Arrays.equals(c, d)); System.out.println("-------------"); int[][] a1 = {{1, 2, 3}, {4, 5, 6}}; int[][] a2 = {{1, 2, 3}, {4, 5, 6}}; System.out.println(a1.equals(a2)); System.out.println(Arrays.equals(a1, a2)); System.out.println(Arrays.deepEquals(a1, a2)); //深度toString() System.out.println(Arrays.toString(a1)); System.out.println(Arrays.deepToString(a1)); //数组的排序 int[] a3 = {3, 2, 5, 4, 1}; System.out.println(Arrays.toString(a3)); Arrays.sort(a3); System.out.println(Arrays.toString(a3)); //一维数组数值检索 int index1 = Arrays.binarySearch(a3, 4); int index2 = Arrays.binarySearch(a3, -12); int index3 = Arrays.binarySearch(a3, 8); System.out.println(index1 + " " + index2 + " " + index3); } } ``` 执行结果: ``` 2 2 2 2 2 2 2 2 2 2 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] [0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0] false true ------------- false false true [[I@3e25a5, [I@19821f] [[1, 2, 3], [4, 5, 6]] [3, 2, 5, 4, 1] [1, 2, 3, 4, 5] 3 -1 -6 Process finished with exit code 0 ``` ## 数组的遍历 ```java public static void main(String[] args) { int[] x = { 1, 2, 3 }; for (int y = 0; y < 3; y++) { System.out.println(x[y]); // System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1; } // 那么这就是数组的第一个常见操作.遍历 } ``` 数组中有一个属性可以获取到数组中元素的个数,也就是数组的长度.数组名.length ```java public static void main(String[] args) { int[] x = { 1, 2, 3 }; for (int y = 0; y < x.length; y++) { System.out.println(x[y]); // System.out.println("x["+y+"]="+x[y]); 打印效果 x[0]=1; } // 那么这就是数组的第一个常见操作.遍历 } ``` ![[3cd4iimt-883bd3c7.jpeg]] ## 数组的复制 ```java java.lang.System public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) ``` **参数:** src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 ## 数组的常见异常 1、数组角标越界异常:,注意:数组的角标从0开始。 ```java public static void main(String[] args) { int[] x = { 1, 2, 3 }; System.out.println(x[3]); //java.lang.ArrayIndexOutOfBoundsException } ``` 2、空指针异常: ```java public static void main(String[] args) { int[] x = { 1, 2, 3 }; x = null; System.out.println(x[1]); // java.lang.NullPointerException } ``` 数组: 什么时候使用数组:当元素较多时为了方便操作这些数组,会先进行来临时存储,所使用的容器就是数组。 特点: 数组长度是固定的。 ## 数组的常见操作 **1、一个数组取出最大值** /\*定义一个获取最大值的功能: 1、确定结果 :返回值类型 int 2、未知内容:要获取哪个数组的最大值没有确定,则是数组没有确定 思路: 1、定义一个变量,记录住数组的比较大的元素。 2、遍历整个数组,让数组的每一个元素都和该变量进行对比即可。 3、当变量遇到比它大的元素,则让该变量记录该元素的值,当循环结束时,最大 值产生了 ```java */ public static int getMax(int[] arr) { //定义变量记录较大的值,初始化为数组中的任意一个元素。 int max = arr[0]; for(int x=1; xmax) max = arr[x]; } return max; } ``` **2、直接排序** 使用直接排序对数组进行排序: /\* 选择排序。 以一个角标的元素和其他元素进行比较。 在内循环第一次结束,最值出现的头角标位置上。 ```java */ public static void selectSort(int[] arr) { for(int x=0; xarr[y]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } } ``` **3、冒泡排序** ```java /* 冒泡排序。 比较方式:相邻两个元素进行比较。如果满足条件就进行位置置换。 原理:内循环结束一次,最值出现在尾角标位置。 */ public static void bubbleSort(int[] arr) { for(int x=0; xarr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } ``` ![[429t2ke1-86b69a71.jpeg]] **4、折半查找(二分法)** ```java /* 为了提高查找效率,可使用折半查找的方式,注意:这种查找只对有序的数组有效。 这种方式也成为二分查找法。 */ public static int halfSeach(int[] arr,int key) { int min,mid,max; min = 0; max = arr.length-1; mid = (max+min)/2; while(arr[mid]!=key) { if(key>arr[mid]) min = mid + 1; else if(keymax) return -1; mid = (max+min)/2; } return mid; } ``` **5、数组翻转** ```java /* 反转其实就是头角标和尾角标的元素进行位置的置换, 然后在让头角标自增。尾角标自减。 当头角标<尾角标时,可以进行置换的动作。 */ public static void reverseArray(int[] arr) { for(int start=0,end=arr.length-1; start