ArrayUtils 源码阅读有感 :) (commons

这两天刚好在等待分配的过程中想着创建自己的代码库的,但是后来想想世界如此之大,咱想到的东东各位大牛基本上都免费提供了,为哈不双手接上呢,鼓掌,感谢!

好了,先说个 ArrayUtils 的大概吧: 顾名思义,这货就是用来进行 array 操作的哦。不过这个工具类很大有6000行左右的说,提供的功能也就相对来说比较完备的。大概有以下几大类方法(其实一般都是 overloading):

EMPTY_… 数组 这一类型的属性是不太会直接使用,一般会作为以下方法中的返回值toString 在操作数组的时候,往往我们会需要查看数组的具体值,尤其是在调试的时候,自己在进行相应的查看操作时通常会比较麻烦的。 下面代码使用的是 JDK 自带的工具方法,也是不错的选择,不过呢在 ArrayUtils 对于 null 值是可以指定替代的值。System.out.println(Arrays.deepToString(array))hashcode 生成一个数组的 hashCode,尤其是多维的数组哦toMap 这个应该算是创建 Map 的一个简便方案,主要是将二维数组转换为 Map,当然第二维需要有两位元素,分别作为 Map 的 key 和 valuetoArray 当我们有不定数量的同类型元素时便可以使用此方法,它为我们将提供的元素放入到数组中,然后返回,很大方有么有clone 对于数组的复制来说,使用这个方法最好不过了,首先 ArrayUtils 对其做了充分的 overloading,其次它的实现方式是调用数组类型本身的方法 clone(),要知道这个底层的实现是 native 方式的,那个速度可想而知了。 当然其实比较明显的是既然 ArrayUtils 自己都调用的是数组的内置方法为啥我们还要多此一举呢?确实这里边的差距不大,但是,如果需要克隆的 array 是个 null 呢?所以呢,ArrayUtils 还是为咱们省了点事儿的,不是说优秀的程序员都爱偷懒儿么:)nullToEmpty 想起第一个属性没?它就起到作用啦,只要 array 是 null 或者 array.length() == 0 那么你就会得到这个 Empty 数组,只是它是不可更改的单元素数组罢了,可以作为一个标志来使用subArray 同样,这个方法确实我们自己实现起来也不难,不过它做了大量的判断,最后通过调用 native 方法来提升元素复制的效率isSameLength 同样,精简比较过程,能处理 array 为 null 的情形getLength 通过 native 方式获取长度reverse overloading 了许多的反转数组的方法,而且也支持反转数组中的部分子元素indexOf 这个方法的实现其实是有超出我的猜测的。在没有看之前自己想想是不是用了什么神奇的方法呢?用的还是比较朴素的做法,逐个比对。不过呢,在其的 overloading 中有对一次性查询多个相同数据的优化方案,这个会结合最后的方法进行解释的。lastIndexOf 和上一个类似,只是顺序调了个头。contains 这个的实现方式也有点出乎我的意料,原来是调用 indexOf 来判断的。toPrimitive 将数组元素统统转换为基本类型,当数组中存在 null 时一定要指定替换的值,否则不包含替代值的方法的调用会报错的,毕竟 null 与任意基本类型都没有对应值,,所以一定注意。 toObject 与上面方法的功能相反isEmpty 简化了的数组判断方法addAll 绝对的将两个数组进行合并哦,null数组也能搞定,只要给它,它就能帮你把它们给结合咯copyArrayGrow1 有没有觉得这个方法的名字高大上,非常清楚以至于我差点不相信自己的眼睛了。。说实话我重来没有在方法名称上使用过阿拉伯数字的说。顾名思义,先 copy 再增大 1 个空间。当然真正实现中是先创建一个 length + 1 的新数组的,然后么在用 native 方法进行 copy。add 额,忘记说了,上边那个方法是 private 的,人家是为此方法服务的,有木有很方便,数组的第一印象应该就是长度的不可变性吧:) 可是人家 ArrayUtils 就不吃你这套,帮咱们实现了数组的加法。神奇吧,不过调用的方法就是上边的 copyArrayGrow1,是不是很坦率。remove 如同 add, remove 的就过也能让数组长度少 1,这与 add 刚好是反过来的哈removeElement 这个与上一个方法的区别在于,上一个是根据元素的 index 来删的,而下一个则是要先找到指定的数组元素时才进行删除removeAll 这个方法还是蛮有意思的,下边会有贴出源代码供共赏removeElements 此方法与上边类似,只不过参数已经是相应的 数组下标了

重点介绍 removeAll,它也是一个 overloading 型选手:

static Object removeAll(final Object array, final int… indices) {final int length = getLength(array);int diff = 0; // 需要移掉的元素数量if (isNotEmpty(indices)) {Arrays.sort(indices);prevIndex = length;= indices[i];if (index < 0 || index >= length) {throw new IndexOutOfBoundsException(“Index: ” + index + “, Length: ” + length);}if (index >= prevIndex) {continue;}diff++;//只要符合情况就增加 1prevIndex = index;}}end = length; (int i = indices.length – 1; i >= 0; i–) {= indices[i];cp = end – index – 1;dest -= cp;//目标数组接收元素的起始下标System.arraycopy(array, index + 1, result, dest, cp);// Afer this copy, we still have room for dest items.}end = index;}if (end > 0) {//只要移除的下标不是0时,就需要执行此 blockSystem.arraycopy(array, 0, result, 0, end);}}return result;}没有了爱的语言,所有的文字都是乏味的

ArrayUtils 源码阅读有感 :) (commons

相关文章:

你感兴趣的文章:

标签云: