前言

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-Objects使用的更多相关文章

  1. How to implement equals() and hashCode() methods in Java[reproduced]

    Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...

  2. Object Pascal中文手册 经典教程

    Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...

  3. guava学习--Objects

    转载:https://my.oschina.net/realfighter/blog/349821 Java中的Object类是所有Java类的超类(也就是祖先),所有对象都实现Object类中的方法 ...

  4. [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  5. Guava学习笔记(二):基础(Joiner,Objects,Splitter及Strings)

    添加Maven依赖 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org.junit ...

  6. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  7. Guava学习笔记(3):复写的Object常用方法

    转自:http://www.cnblogs.com/peida/p/Guava_Objects.html 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals ...

  8. Guava学习笔记:复写的Object常用方法

    在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...

  9. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  10. guava

    原文出处: 黄博文 如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的 ...

随机推荐

  1. 不同路径(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径?)

    示例 1: 输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角. 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -&g ...

  2. fastadmin系统配置

    常规管理--->系统配置--->字典配置-->配置分组-->追加--填上键值-->回车 然后在点上图的+添加自定义的配置项(如果需要删除配置项,需要删除数据库中fa_co ...

  3. poj 1386 Play on Words门上的单词【欧拉回路&&并查集】

    题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...

  4. Jenkins部署码云SpringBoot项目到远程服务器

    本文是上一篇文章的后续,上一篇只是利用Jenkins部署项目到本地,并启动,本文是将项目部署到远程服务器并执行. 1.环境准备 1.1 安装插件 上一篇文章已经介绍了需要安装的应用及插件,这一篇还需要 ...

  5. 关于Git安装和操作中可能碰到的问题

    markdown PDF 大致的安装流程和操作方法可以参照学长给的 Git和GitHub的简单教程 但是在具体实践过程中可能会碰到一些问题 下载 SSH key 先有远程库,要克隆一个本地库 先有本地 ...

  6. Halcon 常用算子使用场合

    Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...

  7. 网络基础配置--开启SSH,关闭Telnet

    1.Telnet和SSH对比 1.1.TELNET 使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令.很快会有人进行监听,并且他们会 ...

  8. BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)

    题目链接 线段树每个节点记录\(f(mid)\)最大的直线(在\(mid\)处函数值最大的直线),称作优势线段(还是直线啊...无所谓了). 如果是在区间插入线段会影响\(O(\log n)\)个区间 ...

  9. JAVA的8种基本数据类型和类型转换

    byte 字节型                        1字节(8bit) 初始值:0 char 字符型 2字节 空格 short 短整型 2字节 0 int 整形    4字节 0 long ...

  10. 2004 ACM 成绩转换 两种方法

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2004 中文题目,简单题. 题意:将分数转换成ABC制 查表法 #include <stdio.h&g ...