java8 java.util.Arrays工具类常用方法分析
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对象。
阅读更多- 关于java.util.Arrays中的方法分析
- java Arrays工具类十大常用方法
- java:数组操作工具类 java.util.Arrays包 主要方法详解
- java.util.Arrays.sort方法简单分析
- 熟练使用Arrays-数组-ArrayList-HashMap等常用Java类型的方法
- Arrays工具类十大常用方法
- Java之Collections工具类方法使用以及源码分析(三)
- [JAVA][StringUtils]字符串工具类的常用方法
- 19-集合框架工具类-17-常用对象API(集合框架-工具类-Arrays-方法介绍)
- StringUtil String工具类常用方法集合
- java实现追加内容到文件末尾的常用方法分析
- JAVA处理日期时间常用方法: java.util.Calendar
- Java之美[从菜鸟到高手演练]之Arrays类及其方法分析
- Android 常用方法集合工具类CommonUtil
- 【深入分析JAVA多线程】(2)Java多线程基本概念和常用方法分析
- 3.8学习内容-常用的Arrays工具类方法和冒泡排序
- java生成随机数的常用方法分析
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)
- 【Java集合的详细研究3】Arrays类常用方法
- Arrays工具类十大常用方法