[Commons]效率篇之數組操作(ArrayUtils)

開篇話: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也有相應的工具,後面的帖子也會涉及到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章