Bloddy 2020-04-23
1.equal()方法
Objects.equal方法可以避免jdk的equal()方法的对象为null时抛出空指针。
Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true其中的源码实现为:
1 public static boolean equal(@Nullable Object a, @Nullable Object b) {
2 return a == b || a != null && a.equals(b);
3 }2.hash()算法
用对象的所有字段作散列[hash]运算,Guava的Objects.hashCode(Object...)会对传入的字段序列计算出合理的、顺序敏感的散列值。你可以使用Objects.hashCode(field1, field2, …, fieldn)来代替手动计算散列值。
public static int hashCode(@Nullable Object... objects) {
return Arrays.hashCode(objects);
}
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}3.toString()方法
好的toString方法在调试时是无价之宝,但是编写toString方法有时候却很痛苦。使用 Objects.toStringHelper可以轻松编写有用的toString方法。例如:
Objects.toStringHelper(this).add("x", 1).toString();
Objects.toStringHelper("MyObject").add("x", 1).toString();
注:底层使用一个单向链表来添加元素。
public String toString() {
boolean omitNullValuesSnapshot = this.omitNullValues;
String nextSeparator = "";
StringBuilder builder = (new StringBuilder(32)).append(this.className).append(‘{‘);
for(Objects.ToStringHelper.ValueHolder valueHolder = this.holderHead.next; valueHolder != null; valueHolder = valueHolder.next) {
if (!omitNullValuesSnapshot || valueHolder.value != null) {
builder.append(nextSeparator);
nextSeparator = ", ";
if (valueHolder.name != null) {
builder.append(valueHolder.name).append(‘=‘);
}
builder.append(valueHolder.value);
}
}
private static final class ValueHolder {
String name;
Object value;
Objects.ToStringHelper.ValueHolder next;
private ValueHolder() {
}
}4.继承Comparable接口
Guava提供了ComparisonChain执行一种懒比较:它执行比较操作直至发现非零的结果,将返回计算结果,在那之后的比较输入将被忽略。
@Override
public int compareTo(Account o) {
return ComparisonChain.start()
.compare(this.accountName, o.accountName)
.compare(this.money, o.money).result();
}