6.3 Java实用工具类

Java中包含实用工具类的包java.util在日常开发中使用得非常频繁,Java 7对这个包中的不少内容进行了更新。

6.3.1 对象操作

在java.util包中新增了一个用来操作对象的工具类java.util.Objects。Objects类中包含的都是静态方法,通过这些方法可以快速对对象进行操作。

在进行两个对象的比较操作时,可以使用Objects类的compare方法。一般来说,进行对象比较是先由Java类实现java.lang.Comparable接口,再通过compareTo方法来进行比较。如果对集合中的元素进行排序,那么还会用到java.util.Comparator接口的实现。Objects类中的compare方法可以将两个对象通过特定的Comparator接口的实现对象来进行比较。代码清单6-10中给出了一个简单的对Long对象进行比较的Comparator接口的实现,以及Objects类的compare方法的使用示例。

代码清单6-10 Objects类的compare方法的使用示例


private static class ReverseComparator implements Comparator<Long>{

public int compare(Long num1,Long num2){

return num2.compareTo(num1);

}

}

public void compare(){

int value1=Objects.compare(1L,2L, new ReverseComparator());

}


判断对象相等的方式一般是调用Object类的equals方法,如判断两个对象a和b是否相等,可以使用代码“a.equals(b)”。Objects类的equals方法可以直接判断两个对象是否相等,如“Objects.equals(a, b)”。此方法的一个好处是会对null值进行处理。如果直接调用一个对象的equals方法,需要先判断这个对象是否为null,而使用Objects类的equals方法则不需要。如果Objects类的equals方法调用时的两个参数的值都是null,则判断结果是true;而如果只有一个参数为null,则判断结果是false;如果两个参数都不为null,则调用第一个参数的equals方法来进行判断。Objects类中与equals方法作用相似的是deepEquals方法,利用该方法也可以对两个对象进行相等性判断。与equals方法不同的是,如果deepEquals方法的两个参数都是数组,则会调用java.util.Arrays类的deepEquals来进行比较。Arrays类的deepEquals方法在进行数组比较时,会考虑数组中的所有元素的相等性。在其他情况下,deepEquals方法和equals方法的作用是相同的。代码清单6-11给出了示例,其中value1和value2的值都为false。

代码清单6-11 Objects类的equals方法的使用示例


public void equals(){

boolean value1=Objects.equals(new Object(),new Object());

Object[]array1=new Object[]{"Hello",1,1.0};

Object[]array2=new Object[]{"Hello",1,1.5};

boolean value2=Objects.deepEquals(array1,array2);

}


Objects类中的hashCode方法可以用来获取对象的哈希值。如果参数为null,那么返回值是0;否则返回值是参数对象的hashCode方法的返回结果。如果需要计算一组对象的哈希值,那么可以使用Objects类的hash方法。Objects类的hash方法的实现使用的是Arrays类中hashCode方法。需要注意的是,在调用hash方法时传入单个对象作为参数的返回结果,与使用同样的参数调用hashCode方法的结果并不相同。如代码清单6-12所示,hashCode1和hashCode3的值是不相同的,Objects类的hash方法有自己的计算方式,不同于hashCode方法。

代码清单6-12 Objects类的hash和hashCode方法的使用示例


public void hash(){

int hashCode1=Objects.hashCode("Hello");

int hashCode2=Objects.hash("Hello","World");

int hashCode3=Objects.hash("Hello");

}


Objects中还有一组用于获取对象的字符串表示的toString方法的不同重载形式。Objects的toString方法在参数为null时返回值是“null”,而在其他情况下相当于调用参数对象的toString方法。如果希望在参数为null时返回给定的内容作为提示信息,那么可以使用toString方法的另外一个重载形式,即通过一个额外的参数来指定参数值为null时的返回结果。如代码清单6-13所示,str1和str2的值分别是“Hello”和“空对象”。

代码清单6-13 Objects类的toString方法的使用示例


public void useToString(){

String str1=Objects.toString("Hello");

String str2=Objects.toString(null,"空对象");

}