您的位置:首页 > 编程语言 > Java开发

java8 java.util.Arrays工具类常用方法分析

2018-11-06 22:10 323 查看

java8 java.util.Arrays工具类分析

阅读了Arrays的源码发现许多网上的分析有错误,所以自己记录一下。

sort,parallelSort方法

Arrays中的sort方法主要有两个一个是sort,一个是parallelSort。
sort是对java基本数据类型可以直接比较的,对于其他的类需要自己重写Comparable函数。
parallelSort是并行的sort在数据量不大的情况下速度没有太大区别。

parallelPrefix方法

使用parallelPrefix的两种方式

Arrays.parallelPrefix(int[] array, IntBinaryOperator op);
Arrays.parallelPrefix(int[] array, int fromIndex, int toIndex, IntBinaryOperator op);

这个方法看起来不容易懂,举个例子

public static void main(String[] args) {
int[] ints = {2, 1, 3};
Arrays.parallelPrefix(ints,(x,y)->(x+y));
System.out.println(Arrays.toString(ints));
}
//结果为[2, 3, 6]

结果为[2,2+1,2+1+3],(x,y)->(x+y)代表二元(x,y)操作,为IntBinaryOperator类。

binarySearch方法

该方法通过二进制搜索算法,不作讲解。

equals,deepEquals方法

equals方法指在一维数组的情况下相等,多维数组就算相等也会返回false。
deepEquals指在多维数组的情况下相等。

public static void main(String[] args) {
int[][] ints = {{1,2},{2,3}};
int[][] tmps = {{1,2},{2,3}};
System.out.println(Arrays.equals(ints,tmps));              //false
System.out.println(Arrays.deepEquals(ints,tmps));      //true
}

fill方法

对数组的元素进行替换。例,用0替换ints中0-1位数字
注:替换的起止坐标需要在数组下标内。

public static void main(String[] args) {
int[] ints = {2, 1, 3};
//Arrays.fill(ints,0) 指用0替换所有
Arrays.fill(ints,0,2,0);  //第2位不包含
System.out.println(Arrays.toString(ints));
//[0, 0, 3]
}

copyOf,copyOfRange方法

copyOf方法将数组从头进行复制,多余的位置进行补0

public static void main(String[] args) {
int[] ints = {1,2,3};
int[] tmps = Arrays.copyOf(ints, 5);
System.out.println(Arrays.toString(tmps));
//[1, 2, 3, 0, 0]
//从头开始复制多余补0
}

相比于copyOf方法,copyOfRange多了一个开始坐标

public static void main(String[] args) {
int[] ints = {1,2,3};
int[] tmps = Arrays.copyOfRange(ints, 2,5);
System.out.println(Arrays.toString(tmps));
//[3, 0, 0]
//从第二位开始复制,多余补0
}

asList方法

将数组转化为ArrayList。

public static void main(String[] args) {
String[] strings={"0","1"};
List<String> list=Arrays.asList(strings);
}

注:
1.不适用于基本数据类型(byte,short,int,long,float,double,boolean)。
2.不支持add和remove方法。
3.该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新

转载CSDN的一篇文章

import java.util.Arrays;
import java.util.List;

/**
*
* 本类演示了Arrays类中的asList方法
* 通过四个段落来演示,体现出了该方法的相关特性.
*
* (1) 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用
* (2) 当使用asList()方法时,数组就和列表链接在一起了.
*     当更新其中之一时,另一个将自动获得更新。
*     注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性
* (3) asList得到的数组是的没有add和remove方法的
*
* 阅读相关:通过查看Arrays类的源码可以知道,asList返回的List是Array中的实现的
* 内部类,而该类并没有定义add和remove方法.另外,为什么修改其中一个,另一个也自动
* 获得更新了,因为asList获得List实际引用的就是数组
*/
public class AsListTest {

public static void main(String[] args) {

/* 段落一:基本数据类型使用asList中的问题 */

/* 说明:虽然在JDK1.6中能够将基本数据类型的数组转换成List,但还是有个缺陷 */
int[] a_int = { 1, 2, 3, 4 };
/* 预期输出应该是1,2,3,4,但实际上输出的仅仅是一个引用, 这里它把a_int当成了一个元素 */
List a_int_List = Arrays.asList(a_int);
foreach(a_int_List);
/* 为此我们需要这样遍历其中元素 */
foreachForBase(a_int_List);

/* 段落二:对象类型的数组使用asList,是我们预期的 */
Integer[] a_Integer = new Integer[] { 1, 2, 3, 4 };
List a_Integer_List = Arrays.asList(a_Integer);
foreach(a_Integer_List);

/* 段落三:当更新数组或者asList之后的List,另一个将自动获得更新 */
a_Integer_List.set(0, 0);
foreach(a_Integer_List);
foreach(a_Integer);

a_Integer[0] = 5;
foreach(a_Integer_List);
foreach(a_Integer);

/* 段落四:对基本类型数组,通过asList之后的List修改对应的值后,在运行时会报出异常
* 但是基本类型数组对应的List是会发生变化的,这是毫无疑问的
*/

/*
* a_int_List.set(0, 0);
* foreach(a_int_List); foreach(a_int);
*/

a_int[0] = 5;
foreachForBase(a_int_List);
foreach(a_int);

}

/* 打印方法 */
private static void foreach(List list) {
for (Object object : list) {
System.out.print(object + " ");
}
System.out.println();

}

private static void foreachForBase(List a_int_List) {
int[] _a_int = (int[]) a_int_List.get(0);
foreach(_a_int);
}

private static void foreach(int[] a_int) {
for (int i : a_int) {
System.out.print(i + " ");
}
System.out.println();
}

private static void foreach(Integer[] _a_Integer) {
for (int i : _a_Integer) {
System.out.print(i + " ");
}
System.out.println();
}
}

转自:https://www.geek-share.com/detail/2697177740.html

hashCode,deepHashCode方法

一维,多维数组获得哈希值方法,不多讲解

toString,deepToString方法

toString,deepToString分别将一维数组和多维数组转化为String

public static void main(String[] args) {
int[] tmp = {1, 2};
int[][] ints = {{1,2},{2,3}};
System.out.println(Arrays.toString(tmp));
System.out.println(Arrays.deepToString(ints));
System.out.println(Arrays.toString(ints));  //无法打印深层数组
}
//[1, 2]
//[[1, 2], [2, 3]]
//[[I@74a14482, [I@1540e19d]

setAll,parallelSetAll方法

setAll遍历每一个元素执行方法,parallelSetAll是其并行方法。

int[] tmp = {1,2,3,4,5};
Arrays.setAll(tmp,x->x*5);
System.out.println(Arrays.toString(tmp));
//[0, 5, 10, 15, 20]

stream方法

返回stream,能使用stream相关的操作。

spliterator方法

返回Spliterator对象。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: