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
614 0
|
3月前
|
Java
常用工具类-Objects
本文介绍了Java标准库中的Objects工具类,它提供了一系列用于操作对象的实用方法,包括判断对象是否为空、比较两个对象是否相等、比较两个对象以及判断两个数组是否深度相等。文章通过示例代码展示了Objects类中isNull、nonNull、requireNull、equals、compare和deepEquals等方法的使用,突出了Objects类在处理对象时的便利性和实用性。
常用工具类-Objects
|
6月前
|
Java 编译器
Guava Optional类分析
Guava Optional类分析
Guava Optional类分析
|
Java
Guava Lists工具类
Guava Lists工具类
77 0
|
API
Google Guava之Maps&Lists&Sets
日常开发中,使用最多的就是集合了,所以避免不了对集合的各种操作,本篇文章来看一下,Guava中都有哪些常用的集合操作的API可以简化我们的代码。
233 0
Google Guava之Maps&Lists&Sets
|
存储 缓存 Java
Guava中这些Map的骚操作,让我的代码量减少了50%
Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。
192 0
|
安全 Java Maven
Guava 如何让 Map 不可变之 ImmutableMap
Guava 如何让 Map 不可变之 ImmutableMap
426 0
Guava 如何让 Map 不可变之 ImmutableMap
|
Java API
Guava - Maps.newHashMap 和 new HashMap 区别
Guava - Maps.newHashMap 和 new HashMap 区别
911 0
|
缓存 Java
Guava之Supplier缓存使用示例
使用guava作内存缓存,大多数小伙伴应该都使用过,通过CacheBuilder创建LoadingCache一个kv格式的缓存,如果我们需要缓存的只是一个value呢? 针对这种场景,接下来介绍一种基于Supplier来实现的缓存方式
558 0
|
Java Shell
Guava Multimap putAll OOM?
近日使用```ArrayListMultimap```的putAll时犯了一个错误,先看一下Code,Pos1、2、3、4输出什么值? ```java //test1 Set sets = new HashSet(); sets.add(1L); sets.add(2L); Multimap maps = ArrayListMultimap.create(); maps.putAll("A"
208 0