欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-arrays/

java.util.Arrays类能方便地操作数组,它提供的方法都是静态的。整个Arrays工具类的实现有3000+行,但是归纳总结一下可知它有以下功能(9个):


1. asList

定义:

    @SafeVarargspublic static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

功能:将一个数组(变长参数的语法糖实现就是数组)转变成一个List(确切的来说是ArrayList),注意这个List是定长的,企图添加或者删除数据都会报错(java.lang.UnsupportedOperationException).
譬如案例1-1:

 List<Integer> list = Arrays.asList(3,4,2,1,5,7,6);System.out.println(list);

输出结果:[3, 4, 2, 1, 5, 7, 6]
但是,对于基础类型(比如byte,int,float等)千万不要想着这么实现(案例1-2,勿效仿):

 int a[] = new int[]{1,2,5,4,6,8,7,9};List list = Arrays.asList(a);

因为List list = Arrays.asList(a);会变成List<int[]> list = Arrays.asList(a);所以遍历需要这样:

        for(int[] arr:list){for(int i:arr){System.out.println(i);}}

这样操作就显得非常的烦琐。因为预想List是List<Integer>形式的,没想到是List<int[]>形式的。使用的时候要特别的注意一下。


2. sort

对数组进行排序。适合byte,char,double,float,int,long,short等基本类型,还有Object类型(实现了Comparable接口),如果提供了比较器Comparator也可以适用于泛型。
案例2-1(基础类型,输出:[1, 1, 4, 4, 5, 6, 7, 9]):

        int a[] = new int[]{1,9,5,4,6,4,7,1};Arrays.sort(a);System.out.println(Arrays.toString(a));

案例2-2(String类型(Object),实现了Comparable接口,输出:[s1, s2, s3, s4]):

        String str[] = {"s2","s4","s1","s3"};Arrays.sort(str);System.out.println(Arrays.toString(str));

案例2-3 (自定义类型,实现了Comparable接口,输出:[jj:17, zzh:18, qq:19]):

        Person1 persons[] = new Person1[]{new Person1("zzh",18),new Person1("jj",17),new Person1("qq",19)};Arrays.sort(persons);System.out.println(Arrays.toString(persons));

案例2-4(泛型,如果类型没有实现Comparable接口,可以通过Comparator实现排序):

        Person2 persons2[] = new Person2[]{new Person2("zzh",18),new Person2("jj",17),new Person2("qq",19)};Arrays.sort(persons2,new Comparator<Person2>(){@Overridepublic int compare(Person2 o1, Person2 o2){if(o1 == null || o2 == null)return 0;return o1.getAge()-o2.getAge();}});System.out.println(Arrays.toString(persons2));

输出:[jj:17, zzh:18, qq:19]
关于类Person1和类Person2的详细细节可以参考《Comparable与Comparator浅析》


3. binarySearch

通过二分查找法对已排序(譬如经过Arrays.sort排序,且按照升序进行排序。如果数组没有经过排序,那么检索结果未知)的数组进行查找。适合byte,char,double,float,int,long,short等基本类型,还有Object类型和泛型(参考sort那段)
案例3-1:

        String str[] = {"s2","s4","s1","s3"};Arrays.sort(str);System.out.println(Arrays.toString(str));int ans = Arrays.binarySearch(str, "s1");System.out.println(ans);

输出:

[s1, s2, s3, s4]
0

4. copyOf

数组拷贝,底层采用System.arrayCopy(native方法)实现。
案例4-1:

        String str[] = {"s2","s4","s1","s3"};String str2[] = Arrays.copyOf(str, str.length);System.out.println(Arrays.toString(str2));

输出:[s2, s4, s1, s3]


5. copyOfRange

数组拷贝,指定一定的范围,譬如(public static T[] copyOfRange(T[] original, int from, int to))。底层采用System.arrayCopy(native方法)实现。
案例5-1:

        String str[] = {"s2","s4","s1","s3"};String str2[] = Arrays.copyOfRange(str,1,3);System.out.println(Arrays.toString(str2));

输出:[s4, s1]


6. equals和deepEquals

equals:判断两个数组的每一个对应的元素是否相等(equals, 对于两个数组的元素o1和o2有o1==null ? o2==null : o1.equals(o2))。
案例6-1:

        String str1[] = {"s2","s4","s1","s3",null};String str2[] = Arrays.copyOf(str1, str1.length);System.out.println(Arrays.equals(str1, str2));

输出:true
deepEquals:主要针对一个数组中的元素还是数组的情况,类似deepToString, deepHashCode如下:
案例6-1:

     int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int a4[] = new int[]{1,2,3};int a5[] = new int[]{1,3,3};int a6[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};int[] b [] = new int[][]{a4,a5,a6};System.out.println(Arrays.equals(a, b));System.out.println(Arrays.deepEquals(a, b));

输出结果:

false
true

7. fill

给数组赋值。填充数组之用。
案例7-1:

        String str[] = {"s2","s4","s1","s3",null};System.out.println(Arrays.toString(str));Arrays.fill(str, "s5");System.out.println(Arrays.toString(str));

输出:

[s2, s4, s1, s3, null]
[s5, s5, s5, s5, s5]

8. toString和deepToString

toString:对于一个数组int a[] = new int[]{1,9,5,4,6,4,7,1};如果按照System.out.println(a);打印企图可以打印出[1,9,5,4,6,4,7,1],实际上只会打印出[I@3e2de41d这种。在打印数组的时候需要写成Arrays.toString(a)的形式。可参考sort的详解。
deepToString:当数组中又包含数组,那么就不能单存的利用Arrays.toString()了,请看例子。
案例8-1:

        int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};System.out.println(Arrays.toString(a));System.out.println(Arrays.deepToString(a));

输出结果:

[[I@1b6b7f83, [I@2e807f85, [I@76340c9c]
[[1, 2, 3], [1, 3, 3], [4, 3, 2, 1]]

相信各位应该看到差别了吧。


9. hashCode和deepHashCode

hashCode:计算一个数组的hashCode.对于一个数组Object[], hashCode方法返回的值取决于:数组中每个元素的元素oi.hashCode()的值初级计算result = 31 * result + (oi== null ? 0 : oi.hashCode());
deepHashCode: 对于一个数组Object[], deepHashCode取决于:数组中每个元素oi,如果oi还是一个数组,那么就继续深入的去获取hashCode,这段比较绕,来个例子比较形象。
案例9-1:

        int a1[] = new int[]{1,2,3};int a2[] = new int[]{1,3,3};int a3[] = new int[]{4,3,2,1};int[] a [] = new int[][]{a1,a2,a3};System.out.println(Arrays.hashCode(a));System.out.println(Arrays.deepHashCode(a));

运行结果:

-1683374023
31646847

这样可以看到hashCode与deepHashCode的区别。对于数组而言hashCode只调用到它第一层元素,deepHashCode会一直调用直至不能再拆分成数组的元素。


参考资料:

  1. 《Comparable与Comparator浅析》

欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-arrays/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


Java集合框架:Arrays工具类相关推荐

  1. 【Java源码分析】集合框架-Collections工具类-Arrays工具类

    集合框架Collection 和Collections和Arrays工具类 一开始总是搞不清楚Collection和Collections的区别,不过看下代码应该很清楚,一个是接口,一个是工具类 Co ...

  2. java集合框架——接口图+类图+遗留类图

    [0]README 0.1)绝对的干货,理清 java集合框架中类和接口的层次关系:

  3. Java集合框架之ArrayList类

    ArrayList是一个泛型数据结构,即对象/引用类型是在<E>里进行确定的(E中定义的必须是对象/引用).例如,定义一个字符串类型的ArrayList为如下格式: ArrayList&l ...

  4. Java中的Arrays工具类-Arrays.toString();Arrays.copyOf();Arrays.copyOfRange()

    目录 一.Arrays.toString() Arrays.toString() 的作用 Arrays.toString() 直接使用实现代码 Arrays.toString()模拟实现代码 二.Ar ...

  5. JAVA中调用Arrays工具类遇见的问(帮忙指点一下)

    帮忙解决一下 为什么index返回的值为-7,不应该是正数吗 int[] arr3 = new int[]{-2,45,26,78,984,35,351,354,87,65,5664,6};int i ...

  6. Java集合框架--List、Set、Map

    Java集合框架接口和类的层次结构: java.util.Collection [I] +--java.util.List [I]+--java.util.ArrayList [C]+--java.u ...

  7. 【Java集合框架】ArrayList类方法简明解析(举例说明)

    本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...

  8. java集合框架(Framework)的性能

    关于Java集合框架里面常用类的性能测试比较,包括(ArrayList/LinkedList /Vector/Queue/TreeSet/HashSet/LinkedHashSet/TreeMap/H ...

  9. JavaSE入门学习34:Java集合框架之Collection接口、子接口及其实现类

    一Collection接口 Collection接口定义了存取一组对象的方法,其子接口Set.List和Queen分别定义了存储方式. 使用Collection接口需要注意: 1Collection接 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(1)
  2. linux下配置tomcat、resin
  3. CS294-112 深度强化学习 秋季学期(伯克利)NO.3 Reinforcement learning introduction
  4. oraclemt 无法启动服务_电脑文件无法设置共享的解决方法
  5. 台湾印象之五:宝岛万象
  6. const参数,const返回值与const函数
  7. 斗地主综合案例之有序版本
  8. 李宁是怎么输给安踏的?
  9. 微信对网络影响的技术试验及分析(论文全文)
  10. 《公共安全视频监控联网信息安全技术要求》(国标GB/35114-2017)
  11. #C语言或C++中强大的图形库——easyx
  12. 被static修饰的map、list GC问题
  13. 快速入门Unity机器学习:三:
  14. android实现跑马灯效果,Android新手开发之旅-实现跑马灯效果
  15. NVIDIA GeForce G102M
  16. 一项调查:从浅到深的机器学习方法的血压估计使用生物传感器【翻译】
  17. IOS 个人苹果开发者账号申请流程
  18. “智多星”智能手机销售网
  19. GPT-4正式发布!如何访问 怎么免费使用GPT-4?
  20. python定义多项式除法_python如何进行多项式的加减乘除

热门文章

  1. RabbitMq链接
  2. dsPIC30F 细节点问题不定期更新ing
  3. 解决问题Can’t connect to local MySQL server through socket
  4. 如何取消 DiscuzX 帖子被系统自动隐?
  5. mongodb - 查看正在执行的操作
  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
  7. DB2更改数据文件路径
  8. CodeForces - 1422E Minlexes(dp+字符串)
  9. 牛客 - 仓库选址(中位数+思维)
  10. 安卓app 获取view的id_隐私保护问题不小 研究表示1325个安卓APP未经授权获取用户数据...