在平常代碼使用中,咱們常常遇到判斷字符串爲空,或者集合爲空的操做。例如判斷集合爲空,個人第一反應是list.size() == 0,前幾天利用sonarLint提供的代碼建議,發現其實還有list.isEmpty()來判斷,這種寫法比size() == 0優雅許多,工具類的好處就是避免重複寫出現錯誤,同時經過工具名稱增長代碼易讀性,這引起我去總結一下Java還自帶那些這些工具。java
在業務中會遇到這種狀況,從Map中去取值,而後和一個固定的值進行對比,來作業務。咱們可能會想下面同樣去作sql
String val = MapUtils.getString(map,key); val.equals("abc");
以防val爲null的時候,會出現NPE的問題,代碼規範建議會這樣寫:數組
"abc".equals(val);
其實在Java7的時候,Java就提供了Object的工具類,字符串和Object類型能夠經過下面的方法區比較:函數
Objects.equals(val1,val2);
固然這個方法本質上是val1.equals(val2),因此boolean型的true是不會等於String的"true"的。工具
Objects類的經常使用方法:ui
Objects.equals(ss1,ss2);//true 其實和 ss1.equals(ss2)是等價的,可是不適合集合類的 集合了對比能夠用deepEquals Objects.requireNonNull("運行時異常 NPE的內容"); // 感受做用不大,咱們對NPE是在代碼中進行處理才合適 Objects.isNull(ss1);//判斷對象爲空 相反的是 nonNull Objects.toString(ss1,"");//對象轉字符串,還能夠設置默認值 Objects.hashCode(ss1);//計算對象的哈希值
最經常使用的是format函數了,經過佔位符進行字符串的格式化,在拼接sql的時候很是好用,好比:spa
String sql = "select * from %s"; sql = String.format(sql,"T_Test"); System.out.println("sql=" + sql);//輸出爲sql=select * from T_Test
高級一點的應用是在有多個地方須要格式化的時候,能夠經過$創建參數索引,好比:代碼規範
sql = "select * from %1$s where %2$s and b=(select d from %1$s)"; sql = String.format(sql, "T_test1","b='1'"); System.out.println("sql=" + sql);//輸出爲 sql=select * from T_test1 where b='1' and b=(select d from T_test1)
固然format還有一些特殊的用法,能夠讀一下這篇博文:http://kgd1120.iteye.com/blog/1293633。code
建立一個集合數組,而後進行初始化,能夠經過構造函數進行初始化集合數組,若是Arrays工具類的話,可使用它的asList的初始化方法,以下:orm
List l1 = Arrays.asList("aa","bb","cc");//構建並初始化新的List集合 List l2 = new ArrayList(){{ add("aa"); add("bb"); add("cc"); }}; System.out.println("l1 = " + l1.toString());//l1 = [aa, bb, cc] System.out.println("l2 = " + l2.toString());//l2 = [aa, bb, cc]
初始化集合數組的效果大致同樣,固然咱們還有能夠用guava工具的ImmutableList.of()去實現,這個留在另一篇博客再講。
二分查找binarySearch(),返回的是一個下標,相對於線性查找(indexOf、contains、find),底層是按照二叉樹原理查找的,在使用二分查找的時候 一個首要的前提,數據集已經實現了升序排列,網上有人對線性查找和二分查找有過對比,在數組長度比較大的狀況下,用二分查找效率纔會高,在長度70如下,效率不如線性查找,使用方法以下:
List l1 = Arrays.asList("aa","bb","cc");//構建一下新的List集合 Arrays.sort(l1.toArray()); //在使用二分查找的時候 一個首要的前提,數據集已經實現了升序排列 Arrays.binarySearch(l1.toArray(),"aa");