Arrays数组工具类

位于java.util包内的Arrays类是Java提供的一个 操作数组 的工具类,其内部定义了一些常见的用于操作数组的静态方法

1:数组转List;2:排序3:查找4:元素填充;5:数组复制;6:toString;7:相等性判断;8:数组交换

1: Arrays.asList([]) ;
  • asList 不接受基本数据类型的数组名,作为参数直接传递。
  • asList 通过backed(拷贝)的方式,返回的是一个固定长度的List;
  • 不能对这个返回的List执行add 方法,可以调用set方法。arrays中的ArrayList并不是平常使用的arraylist,它并没有实现list接口,而是直接继承的AbstractList;且没有复习add方法;
  • 同理不能调用remove方法,但可以调用get方法获取元素。
List转数组的实现,Collection接口定义了统一的方法toArray

2:sort(): 实现数组的排序,默认按升序进行排列 ;
一类是基本数据类型的排序,一类是Object类型的排序;
sort静态方法的实现,按参数主要有两种实现方法,一种是数组整体进行排序;一种是在数组内指定一段起始位置进行排序,之后的 对象数组 排序也只是按指定起始位置排序,不再重复描述。其内部具体实现是DualPivotQuicksort(双轴快速排序);

2.1 基本数据类型的排序
  • 可以接收的参数类型可以是int,long,short,char,byte,float,double类型数组。
2.2 Object 类型数组排序
public static <T> void sort(T[] a, Comparator<? super T> c) {
这个方法是泛型为T的数组,需要提供一个实现了Comparator接口的实例,同理也是必须明确告知排序规则,如果同时实现了Comparable接口和Comparator接口,Comparator接口的实现将覆盖Comparable接口的排序规则。
使用这个方法时,提供的“数组中的对象”必须是实现了Comparable接口的,也就是说必须告知明确告知,对数组中的对象是按什么规则排序。
[ 对象数组排序内部实现采用了LegacyMergeSort(归并排序)和TimSort排序。 ]
parallelSort
parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多线程并行的方式进行排序,当数据规模较大时和sort相比有明显优势;具体可见 arrays-sort-versus-arrays-parallelsort .

3: 查找
Arrays内部的查找,主要是binarySearch(二分查找法)。可以说,关于查找到实现分类和排序完全一样。首先从数据类型上也是 分为基础数据类型构成的数组和对象数组。都支持 按特定范围进行排序;对于对象数组的排序,对象数组需要实现Comparable接口或者是提供Comparator接口的实例。


4: fill() :元素填充
结论:java.util.Arrays.fill() 方法只适合于把数组用同一个值初始化;

5:copyOf(); 实现两个将 原数组 按指定长度复制到 目标数组内 返回。
其内部使用System.arraycopy方法,这是一个Java提供的native方法,因此效率会高一些。Java 内部关于数组复制的实现,都用到了这个方法。
同样,也包括一个copyOfRange的方法,这个按名字就可以理解,就是按照范围进行复制。


6:toString()
这个toString的静态方法,其实也很实用;从下面的代码的实现,可以看出,他的作用就是将我们定义的数组,按照 "[a0,a1,....]"的格式转成字符串,方便我们直接打印整个数组,打印出来的日志也会看起来更直观,更方便;


7:equals相等性
Arrays内部关于两个数组相等的判断可以首先看下下面的代码:
基础数据类型数组,以long类型为例
public static boolean equals(float[] a, float[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i])) return false; return true; }
Object 类型数组
public static boolean equals(Object[] a, Object[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i<length; i++) { Object o1 = a[i]; Object o2 = a2[i]; if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return true; }

deepEquals
关于deepEquals和equals的区别,可以看看这篇文章 Java中Arrays类的两个方法:deepEquals和equals

8:swap数组交换
/** * Swaps x[a] with x[b]. */ private static void swap(Object[] x, int a, int b) { Object t = x[a]; x[a] = x[b]; x[b] = t; }











<think>首先,用户的问题是关于Java中Arrays工具类数组相关的使用方法、功能等信息。用户特别提到了“Java中Arrays工具类数组的使用”,所以我需要基于提供的引用内容来回答。 回顾系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如 [^1]。 用户提供了多个引用: - [^1]:展示Arrays.toString()、Arrays.sort()、Arrays.fill()的使用。 - [^2]:展示Arrays.equals()、Arrays.toString()、Arrays.sort()的使用。 - [^3]:展示Arrays.toString()、Arrays.sort()部分排序、Arrays.binarySearch()的使用。 - [^4]:展示Arrays.sort()、Arrays.copyOf()的使用。 - [^5]:展示Arrays.toString()、Arrays.sort()、Arrays.binarySearch()的使用。 我需要整合这些信息,提供一个清晰、结构化的回答。结构应该包括: 1. **引言**:简述Arrays工具类的作用。 2. **常用方法**:详细描述每个方法的使用、功能和示例。 3. **总结**:总结Arrays工具类的好处或注意事项。 4. **相关问题**:生成相关问题。 确保使用中文回答。 现在,梳理关键方法: - **toString(int[] a)**:将数组转换为字符串表示形式,便于输出。示例:Arrays.toString(a) 输出类似 [1, 2, 3]。 - **sort()**:对数组排序。有多种重载: - sort(int[] a):排序整个数组。 - sort(int[] a, int fromIndex, int toIndex):排序指定范围。 - **fill()**:将数组的部分或全部填充为指定值。示例:Arrays.fill(a, 2, 4, 0) 填充索引2到3(不包括4)为0。 - **equals()**:比较两个数组是否相等。示例:Arrays.equals(a, b)。 - **binarySearch()**:使用二分查找搜索数组。前提是数组已排序。 - **copyOf()**:复制数组到新数组,可以指定新长度,实现扩容或缩容。示例:Arrays.copyOf(intNum, 10)。 从引用中提取: - [^1]:Arrays.toString(), Arrays.sort(), Arrays.fill(). - [^2]:Arrays.equals(), Arrays.toString(), Arrays.sort(). - [^3]:Arrays.toString(), Arrays.sort(range), Arrays.binarySearch(). - [^4]:Arrays.copyOf(), Arrays.sort(). - [^5]:Arrays.toString(), Arrays.sort(), Arrays.binarySearch(). 覆盖所有方法:toString, sort, fill, equals, binarySearch, copyOf. 在回答中,自然地添加引用标识。例如,提到方法时,在后面加引用,如 [^1]。 回答结构: 1. **介绍**:Arrays工具类是Java java.util包下的一个类,提供静态方法来操作数组。 2. **常用方法**: - toString():描述、示例、引用。 - sort():描述、重载示例、引用。 - fill():描述、示例、引用。 - equals():描述、示例、引用。 - binarySearch():描述、注意事项、示例、引用。 - copyOf():描述、示例、引用。 3. **总结**:强调便利性和常见用途。 4. **相关问题**:生成3-5个相关问题,如“Arrays.sort()的时间复杂度是多少?”或“如何自定义排序?”等。 生成相关问题: - 基于系统指令示例:快速排序相关问题。 - 针对Arrays工具类:性能、优化、应用场景等。 相关问题示例: 1. Arrays.sort() 使用的是哪种排序算法? 2. Arrays.binarySearch() 为什么要求数组已排序? 3. Arrays.fill() 有什么实际应用场景? 4. 如何比较多维数组是否相等? 5. Arrays.copyOf() 与 System.arraycopy() 的区别是什么? 确保使用LaTeX格式: - 行内数学:如数组索引 $i$。 - 独立公式:可能不需要,因为主要是代码和描述。如果有数学相关,加进去。 例如,binarySearch涉及到二分查找,可以用数学表达式: - 时间复杂度 $O(\log n)$,独立公式:$$ \text{时间复杂度} = O(\log n) $$ 在回答中自然地融入。 代码块:用户示例中包含代码。我应该包括代码片段来展示方法的使用,但简化以避免冗长。 最后,输出格式: - 先用中文回答。 - 结尾加 §§相关问题§§ 部分。 开始草拟回答。 </think>### Java中Arrays工具类的使用方法与功能 Java中的`Arrays`工具类(位于`java.util`包下)提供了一系列静态方法,用于简化数组操作,如排序、搜索、复制和输出等。通过使用这些方法,开发者可以高效处理数组,避免手动实现的繁琐代码。下面我将基于引用内容,逐步介绍主要方法的使用方式、功能描述和示例代码。每个方法描述后,会自然地附带相关引用标识。 #### 1. **数组输出:`Arrays.toString()`** - **功能**:将数组转换为字符串表示形式,便于输出数组的所有元素(相比于直接打印数组引用,只显示哈希码)。 - **语法**:`static String toString(数组类型[] a)` - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { int[] a = {132, 54, 48787, 321}; System.out.println(a); // 输出类似 [I@7852e922(数组内存地址) System.out.println(Arrays.toString(a)); // 输出: [132, 54, 48787, 321] } } ``` - **说明**:此方法常用于调试时查看数组内容。引用中展示了多个示例,表明它是基本输出工具[^1][^2][^3]。 #### 2. **数组排序:`Arrays.sort()`** - **功能**:对数组进行升序排序(默认)。支持整型、浮点型、字符串等数组。如果是对象数组,需要实现`Comparable`或自定义`Comparator`接口。 - **重载方法**: - `sort(数组类型[] a)`:排序整个数组。 - `sort(数组类型[] a, int fromIndex, int toIndex)`:排序指定范围(前包括、后不包括索引)。 - **时间复杂度**:通常为 $O(n \log n)$(Java底层使用双轴快速排序或归并排序)。 - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { int[] arr = {24, 69, 80, 57, 13}; System.out.println("排序前: " + Arrays.toString(arr)); // [24, 69, 80, 57, 13] Arrays.sort(arr); // 排序整个数组 System.out.println("排序后: " + Arrays.toString(arr)); // [13, 24, 57, 69, 80] // 部分范围排序 Arrays.sort(arr, 0, 3); // 排序索引0到2(不包括3) System.out.println("部分排序后: " + Arrays.toString(arr)); // 例如 [13, 24, 57, ...] } } ``` - **说明**:排序是Arrays类的核心功能,在多个引用中均有应用[^1][^3][^5]。 #### 3. **数组填充:`Arrays.fill()`** - **功能**:将数组的所有或部分元素填充为指定值。常用于初始化或重置数组。 - **重载方法**: - `fill(数组类型[] a, 值)`:填充整个数组。 - `fill(数组类型[] a, int fromIndex, int toIndex, 值)`:填充指定范围(前包括、后不包括索引)。 - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { int[] a = {1, 2, 3, 4, 5}; Arrays.fill(a, 2, 4, 0); // 填充索引2到3(不包括4)为0 System.out.println(Arrays.toString(a)); // 输出: [1, 2, 0, 0, 5] } } ``` - **说明**:此方法在引用[^1]中被明确展示,用于高效修改数组子集。 #### 4. **数组比较:`Arrays.equals()`** - **功能**:比较两个数组是否相等(元素顺序和值相同)。支持多种数据类型。 - **语法**:`static boolean equals(数组类型[] a, 数组类型[] b)` - **时间复杂度**:$O(n)$(线性遍历比较)。 - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { double[] a = {0.1, 1, 0.8}; double[] b = {0.1, 1, 0.8}; boolean isEqual = Arrays.equals(a, b); // 返回true System.out.println(isEqual); } } ``` - **说明**:比较数组时,避免使用`==`运算符(比较引用地址)。引用[^2]中展示了此方法的实际应用。 #### 5. **二分搜索:`Arrays.binarySearch()`** - **功能**:在已排序数组中使用二分查找算法搜索指定元素。返回元素索引(如果找到),否则返回负值(表示插入点)。 - **前提**:数组必须已排序,否则结果不可靠。 - **重载方法**:支持指定搜索范围。 - **时间复杂度**:$O(\log n)$。 - **数学基础**:二分查找基于分治算法,其平均复杂度为 $\Theta(\log n)$。独立公式表示为: $$ \text{搜索时间} = O(\log n) $$ - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { int[] arr = {13, 24, 57, 69, 80}; // 必须先排序 int index = Arrays.binarySearch(arr, 57); // 返回2(元素索引) int notFound = Arrays.binarySearch(arr, 100); // 返回-6(负值表示插入点) System.out.println("查找下标: " + index); } } ``` - **说明**:此方法高效但依赖有序数组,在引用[^3][^5]中均有演示。 #### 6. **数组复制与扩容:`Arrays.copyOf()`** - **功能**:复制数组到新数组,并可指定新长度(用于扩容或缩容)。新数组长度大于原数组时,多余位置填充默认值(如0或null)。 - **语法**:`static 数组类型[] copyOf(原数组, int newLength)` - **示例**: ```java import java.util.Arrays; public class Example { public static void main(String[] args) { Integer[] intNum = {1, 2, 5, 6}; Integer[] newArray = Arrays.copyOf(intNum, 6); // 复制并扩容为长度6 System.out.println(Arrays.toString(newArray)); // 输出: [1, 2, 5, 6, null, null] } } ``` - **说明**:此方法常用于调整数组大小而不改变原数据,引用[^4]中突出了其作为“静态方法”的特性。 ### 总结 `Arrays`工具类极大简化了Java数组操作,避免了底层代码的重复开发。主要好处包括: - **高效性**:内置方法优化了性能(如排序和搜索)。 - **安全性**:减少手动操作错误(如索引越界)。 - **便利性**:一行代码实现复杂逻辑(如输出或比较)。 使用前需导入`java.util.Arrays`,并注意方法的前提条件(如`binarySearch()`要求数组有序)。引用内容已验证这些方法是标准Java API的一部分[^1][^2][^3][^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值