2019独角兽企业重金招聘Python工程师标准>>>
引言
在日常代码使用中,我们经常遇到判断字符串为空,或者集合为空的操作。例如判断集合为空,我的第一反应是list.size() == 0,前几天利用sonarLint提供的代码建议,发现其实还有list.isEmpty()来判断,这种写法比size() == 0优雅许多,工具类的好处就是避免重复写出现错误,同时通过工具名称增加代码易读性,这引发我去总结一下Java还自带那些这些工具。
Object类
在业务中会遇到这种情况,从Map中去取值,然后和一个固定的值进行对比,来做业务。我们可能会想下面一样去做
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类的常用方法:
Objects.equals(ss1,ss2);//true 其实和 ss1.equals(ss2)是等价的,但是不适合集合类的 集合了对比可以用deepEquals
Objects.requireNonNull("运行时异常 NPE的内容"); // 感觉作用不大,我们对NPE是在代码中进行处理才合适
Objects.isNull(ss1);//判断对象为空 相反的是 nonNull
Objects.toString(ss1,"");//对象转字符串,还可以设置默认值
Objects.hashCode(ss1);//计算对象的哈希值
String类
最常用的是format函数了,通过占位符进行字符串的格式化,在拼接sql的时候非常好用,比如:
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。
Arrays类
创建一个集合数组,然后进行初始化,可以通过构造函数进行初始化集合数组,如果Arrays工具类的话,可以使用它的asList的初始化方法,如下:
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");
Collections类