Guava-Objects使用

简介: Java中的Object提供了很多方法供所有的类使用,特别是toString、hashCode、equals、getClass等方法,在日常开发中作用很大,Guava中包含Objects类,其提供了很多更为强大的方法。

前言


Java中的Object提供了很多方法供所有的类使用,特别是toStringhashCodeequalsgetClass等方法,在日常开发中作用很大,Guava中包含Objects类,其提供了很多更为强大的方法。


Objects


ObjectsObject的子类,其提供了equaltoStringHelper等方法,下面根据一个示例来分析源码。


示例

package com.hust.grid.leesf.guavalearning;
import com.google.common.base.Objects;
public class ObjectsTest {
    public static void main(String[] args) {
        Integer i1 = new Integer(10);
        Integer i2 = new Integer(10);
        System.out.println(Objects.equal(i1, i2));
        System.out.println(Objects.toStringHelper("Person").add("name", "leesf").add("age", 25));
    }
}

运行结果:

true

Person{name=leesf, age=25}

可以看到,Objects对象可以很轻松的比较两个对象是否相等,并且还可以使用toStringHelper来格式化对象的属性,清晰易懂,便于定位异常。


equal方法

Java中的Object对象的equals方法,传递一个参数;而Objects提供equal方法,传递两个参数,来比较两个对象是否相等。

public static boolean equal(@Nullable Object a, @Nullable Object b) {
  return a == b || (a != null && a.equals(b));
}

可以看到,equal方法只是预先进行了一次判断,若为同一个引用,则返回true,否则,调用Object aequals方法,若其重写了equals方法,则调用自身方法,否则调用父类的equals方法,直至最后Object类的equals方法。


toStringHelper方法

该方法是Objects中非常有用的方法,可以格式化对象的输出,一般情况下是重写toString方法,然后将对象的属性逐一写出,而Objects中提供了toStringHelper方法,可以很方便的格式化输出。

  • toStringHelper会生成一个ToStringHelper对象,若传递的为非String类型值,则首先会调用simpleName方法简化类名,如传递的为整形3simpleName方法则返回Integer


ToStringHelper类

在调用toStringHelper方法返回一个ToStringHelper对象,其结构如下。

public static final class ToStringHelper {
  private final String className;
    private ValueHolder holderHead = new ValueHolder();
    private ValueHolder holderTail = holderHead;
    private boolean omitNullValues = false;
  // methods

可以看到其存在一个className属性,用来保存类名,如PersonInteger等字符串;存在一个ValueHolder类型的holderHead对象,表示链表的头结点;存在一个ValueHolder类型的holderTail对象,表示链表的尾节点;存在一个omitNullValues变量用来指示是否跳过null值,其中ValueHolder是实际存放元素的地方,其结构如下。

private static final class ValueHolder {
  String name;
    Object value;
    ValueHolder next;
}

可以看到ValueHolder会单链表结构,当调用add方法时,其就在链表末尾添加一个节点。


add方法

在调用toStirngHelper方法返回ToStringHelper对象后,可调用add方法。add方法整个调用会在链表的末尾添加一个ValueHolder节点,并且使用ToStringHelperholderTail对象指向尾节点。


toString方法

当打印时,会调用ValueHolder对象的toString方法,其会首先输出className{,然后遍历链表,将包含key-value或只包含value类型的节点按照指定格式输出,最后添加}


总结


Objects类源码相对简单,其提供了格式化对象的方法,使用也非常简单,非常方便在实际开发的时候使用。

目录
相关文章
Guava - Maps.difference
Guava - Maps.difference
407 0
|
6月前
|
Java
Guava Lists工具类
Guava Lists工具类
37 0
|
API
Google Guava之Maps&Lists&Sets
日常开发中,使用最多的就是集合了,所以避免不了对集合的各种操作,本篇文章来看一下,Guava中都有哪些常用的集合操作的API可以简化我们的代码。
195 0
Google Guava之Maps&Lists&Sets
|
安全 Java Maven
Guava 如何让 Map 不可变之 ImmutableMap
Guava 如何让 Map 不可变之 ImmutableMap
323 0
Guava 如何让 Map 不可变之 ImmutableMap
|
Java API
Guava - Maps.newHashMap 和 new HashMap 区别
Guava - Maps.newHashMap 和 new HashMap 区别
419 0
|
Java 数据格式
Swagger报错:missed comma between flow collection entries
Swagger报错:missed comma between flow collection entries
300 0
|
编解码 NoSQL Java
Introducing Redisson Live Objects (Object Hash Mapping)
文章来源于阿里云 MVP顾睿。
1170 0
guava学习:guava集合类型-table
最近学习了下guava的使用,这里简单记录下一些常用并且使用的工具类把。 看到table的使用时候真的是眼前一亮,之前的代码中写过很多的Map 这种格式的代码,这种阅读起来非常的不友好,甚至都不知道map中的key到底是什么还要联系上下文联想才可以,而table类型的出现彻底解决掉了这个麻烦。
1478 0
|
存储
guava学习:guava集合类型-Bimap
学习guava让我惊喜的第二个接口就是:Bimap BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射。 最近开发过程中,经常会有这种根据key找value或者根据value找key 的功能,之前都是将值存储到枚举或者map中,然后通过反转的写法来实现的,直到发现了Bimap,才发现原来还有这么简便的方式。
1191 0