[Commons]效率篇之数组操作(ArrayUtils)

来源:互联网 发布:淘宝小二判定错误申诉 编辑:程序博客网 时间:2024/06/06 18:04
开篇话:Apache Commons类库有很多,几乎大多数的开源框架都依赖于它,那么,它有什么好处呢?Commons中的工具会节省你大部分时间,它包含一些常用的静态方法和Java的扩展。是开发中提高效率的一套框架,同时也使得代码变得简单易懂。开Commons效率篇帖子的宗旨是大家看看小例子,自己揣摩揣摩,看看实际的项目中能用到的地方有哪些,然后运用到自己的代码中,使得代码简洁,也提高效率。

    数组是开发中时常会用到的,但是数组在操作和查找过程中也有自己的局限性,如:不能动态改变数组大小,查找元素需要循环遍历。对此,在开发中如何去便捷的使用数组呢?可以看看如下的例子。

    问题:现有一个数组,需要判断该数组中是否存在某个元素,并取得其下标。
    遇到这个问题,估计有多数的人会想去遍历这个数组,逐个判断,直到找到这个对象。例如:
  1. public void contains() {
  2.     String[] strings = { "Red", "Orange", "Blue", "Brown", "Red" };
  3.     boolean containsBlue = false;
  4.     for (String color : strings) {
  5.         if (StringUtils.equals(color, "Blue")) {
  6.             containsBlue = true;
  7.             break;
  8.         }
  9.     }
  10.     System.out.println("Array contains 'Blue'? " + containsBlue);
  11. }
复制代码

输出结果:Array contains 'Blue'? true
    但是,每次都写for循环会使代码的圈复杂度增加有咩有。。。
    其实,Apache Commons Lang库中的ArrayUtils工具类给已经给咱们咱提供了现成的实现。可以只需要一行代码。如下:
  1. public void contains() {
  2.     String[] strings = { "Red", "Orange", "Blue", "Brown", "Red" };
  3.     boolean containsBlue = ArrayUtils.contains(strings, "Blue");
  4.     System.out.println("Array contains 'Blue'? " + containsBlue);
  5. }
复制代码

    如果数组中存放的不是基本类型的元素,该方法会调用元素的equals()方法搜索匹配的对象。
    同样,判断一个元素在数组中的第几个元素,可以这么实现:
  1. public void indexOf() {
  2.     String[] strings = { "Red", "Orange", "Blue", "Brown", "Red" };
  3.     int blueIndex = ArrayUtils.indexOf(strings, "Blue");
  4.     System.out.println("Array indexOf 'Blue'? " + blueIndex);
  5. }
复制代码

输出结果:Array indexOf 'Blue'? 2
ArrayUtils也提供了lastIndexOf方法,方便从后向前查找元素。

    问题:向一个数组中某一个位置添加或者删除元素。
    大家都知道,数组是一经初始化,是不能修改其大小的,这就导致无法直接向数组添加或者删除元素。如果需要实现这个功能,则需要在创建一个数组,其大小为操作完后的数组大小,然后自己for循环把新的数据放入到数组。当然,也可以使用JAVA自带的Arrays类把数组转换为List,然后进行修改。
    ArrayUtils也提供了一行代码搞定问题的方法,如下:
  1. public void add() {
  2.     String[] strings = { "Red", "Orange", "Blue", "Brown", "Red" };
  3.     strings = ArrayUtils.add(strings, 3, "Yellow");
  4.     System.out.println("Array:" + ArrayUtils.toString(strings));
  5. }
复制代码

输出结果:Array:{Red,Orange,Blue,Yellow,Brown,Red}
可以看到,一行代码就完成了添加元素。十分方便。

ArrayUtils中还提供了反转数组,一次添加多个元素等方法例如:
  1. public void reverse() {
  2.     String[] strings = { "Red", "Orange", "Blue", "Brown", "Red" };
  3.     ArrayUtils.reverse(strings);
  4.     System.out.println("Array:" + ArrayUtils.toString(strings));
  5.     strings = ArrayUtils.addAll(strings, "Yellow", "Green");
  6.     System.out.println("Array:" + ArrayUtils.toString(strings));
  7. }
复制代码

输出结果:
Array:{Red,Brown,Blue,Orange,Red}
Array:{Red,Brown,Blue,Orange,Red,Yellow,Green}

其实,实际情况是这样的,大家项目中对集合的操作都用的List,List的确比数组使用起来方便许多。可有的场景下,你拿到的只是一个数组,你只需要完成添加者删除元素等简单方法,就可以使用Commons中提供的方法,不用再做转换。与此同时,Commons 库对Java中的List/Map/Set也有相应的工具,后面的帖子也会涉及到。
1 0
原创粉丝点击