Arrays工具类位于 java.util 包下,是一个比较常用的工具类,其可以针对数组进行各种操作,比如赋值、排序、搜索等等。在项目过程中我们针对数组的有关操作,如果不方便直接操作,均可通过调用此类的某些方法转换成 list 集合进行操作。下面首先介绍 Arrays 类的几种常用方法。

1.   Arrays.asList

此方法是将一个数组直接转换为集合,返回结果为 List集合。下面的代码是该方法的应用。需要注意的是,数组是Integer类型和 int 类型,生成的List 的长度是不一样的。此外,最容易踩的坑是 不能对通过数组生成的 List集合进行 add 和 remove。

        /**
* 关于 Arrays.asList()
*/
Integer[] a = {1,2,3,4,5,6,7};
int[] b = {11,22,33,44,55}; System.out.println("======关于 Arrays.asList=======");
List aList = Arrays.asList(a);
System.out.println(aList.size()); //运行结果为 7
List bList = Arrays.asList(b);
System.out.println(bList.size()); //运行结果为 1
// aList.add(123); // java.lang.UnsupportedOperationException
// bList.remove(1); // java.lang.UnsupportedOperationException

为什么不能对通过数组生成的 List集合进行 add 和 remove?

看源码!!!首先 asList 方法返回的是一个 ArrayList类,这个类不是我们java集合中的 ArrayList,这个ArrayList 集合继承了 AbstractList,我们在调用 add 方法或者 remove 方法时都是调用的 AbstractList 中的 add 或者 remove 方法,这个方法本身就会抛出异常,因此针对通过数组生成的List类不能直接对其进行add或者remove。

 

2.   Arrays.fill

该方法的主要作用是对应一个给定的数组,对其进行赋值操作,其可以支持对于该数组的全部元素进行赋值,也可以支持对于给定数组的给定起始位置进行赋值,当然其符合“左闭右开”原则,即包括起始元素但不包括结束元素,与 String的subString方法中只包括 beginIndex,不包括 endIndex一样。

 /**
* 关于 Arrays.fill
* 若是 int 类型, 未赋值元素为0; 若是 Integer 类型, 未赋值元素为 null;
*/
Integer[] c = new Integer[10];
Integer[] d = new Integer[10];
Arrays.fill(c,33);
Arrays.fill(d,6,8,33);
System.out.println("============关于 Arrays.fill============");
System.out.println(Arrays.asList(c)); // [33, 33, 33, 33, 33, 33, 33, 33, 33, 33]
System.out.println(Arrays.asList(d)); // [null, null, null, null, null, null, 33, 33, null, null]

3.   Arrays.equals

该方法的主要作用是比较两个数组是否相等,不用我们手动比较两个数组的每个元素是否相等。当然,如果两个数组只是某些元素的顺序不同,其返回结果也是不相等的。

         /**
* 关于 Arrays.equals
*/
int[] e1 = new int[]{1,2,3};
int[] e2 = null;
int[] e3 = new int[]{};
int[] e4 = new int[]{1,2,3};
int[] e5 = new int[]{1,3,2};
System.out.println("=======关于 Arrays.equals========");
System.out.println(Arrays.equals(e1,e2)); //false
System.out.println(Arrays.equals(e1,e3)); //false
System.out.println(Arrays.equals(e1,e4)); //true
System.out.println(Arrays.equals(e2,e3)); //false
System.out.println(Arrays.equals(e1, e5)); //false

  具体怎么实现的呢?看源码!!!只不过是先针对null的情况进行判断,然后根据数据的长度进行判断,最后再依次比较每个元素是否相等

  

4.   Arrays.toString

该方法比较简单,主要是将数组打印出来,对于Integer 和 int 类型的数组均可实现,其实现源码如下,通过 StringBuilder进行拼接。

       /**
* 关于 Arrays.toString()
*/
Integer[] f = {1,2,3,4,5,6,7};
int[] g = {1,2,3,4,5,6,7}; System.out.println("========关于 Arrays.toString=========");
System.out.println(Arrays.toString(f)); //运行结果为 [1, 2, 3, 4, 5, 6, 7]
System.out.println(Arrays.toString(g)); //运行结果为 [1, 2, 3, 4, 5, 6, 7]

5.   Arrays.sort() 和 Arrays.binarySearch()方法

  这两个也是比较常用的方法。Arrays.sort()是对给定的数组进行排序,当然可以重写其比较方法更高排序的顺序,默认是升序,具体可参见博文 https://www.cnblogs.com/Demrystv/p/11564054.html ; Arrays.binarySearch()方法是对排序好的方法采用二分查找的方式进行查找,返回目标元素在数组中的位置。在此不再赘述。

Java集合之Arrays 剖析的更多相关文章

  1. 转:【Java集合源码剖析】Java集合框架

    转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663   Java集合工具包位于Java.util包下,包含了很多常用的数据结构, ...

  2. 【Java集合源码剖析】Java集合框架

    Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...

  3. 转:【Java集合源码剖析】Vector源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865   Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量 ...

  4. 转:【Java集合源码剖析】ArrayList源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011   本篇博文参加了CSDN博文大赛,如果您觉得这篇博文不错,希望您能帮我投一 ...

  5. Java集合源码剖析——ArrayList源码剖析

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  6. 转:【Java集合源码剖析】Hashtable源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元 ...

  7. 转:【Java集合源码剖析】HashMap源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955   您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...

  8. 转:【Java集合源码剖析】LinkedList源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253   您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...

  9. 【Java集合源码剖析】Hashtable源码剖析

    转载出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一 ...

随机推荐

  1. landsat8波段叠加(layer stacking)

    许久没更.最近一直在看IDL,忽略了gdal的学习. 今天做了landsat8的辐射定标,需要通过reflectance gains/bias来进行波段运算.由于landsat8 oli未提供一个完整 ...

  2. tar命令详解及使用实例

    tar命令 [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 …. 参数: -c :创建压缩文件 -x :解开压缩文件 -t :查看tar包里面的文件! 上面3个参数只能 ...

  3. LeetCode 684. Redundant Connection 冗余连接(C++/Java)

    题目: In this problem, a tree is an undirected graph that is connected and has no cycles. The given in ...

  4. Ubuntu mysql踩坑记录

    安装: 1.sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3.  sudo apt-get install lib ...

  5. 面试突击 | Redis 如何从海量数据中查询出某一个 Key?附视频

    1 考察知识点 本题考察的知识点有以下几个: Keys 和 Scan 的区别 Keys 查询的缺点 Scan 如何使用? Scan 查询的特点 2 解答思路 Keys 查询存在的问题 Scan 的使用 ...

  6. 用原生JS&PHP简单的AJAX实例

    功能介绍: 1)file.html 使用 xmlhttp 请求服务器端文件 text ,并更新 file.html 的部分内容 2)update.html 使用 xmlhttp 通过 filewrit ...

  7. java设计模式--迪米特法则

    基本介绍 1.一个对象应该对其他对象保持最少的了解 2.类与类关系越密切,耦合度越大 3.迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好.也就是说,对于被依赖的类不管多么复杂,都尽量 ...

  8. RxHttp 让你眼前一亮的Http请求框架

    1.前言 RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有1100+star,为此,我自己也建个RxHttp&RxLife 的群(群 ...

  9. mysql数据库批量执行sql文件对数据库进行操作【windows版本】

    起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: ...

  10. powersploit的两个信息收集的脚本

    0x00 简介 powersploit是基于powershell的渗透工具包,里面都是powershell的脚本工具文件.工具包地址:https://github.com/PowerShellMafi ...