Guava-Objects使用
前言
Java
中的Object
提供了很多方法供所有的类使用,特别是toString
、hashCode
、equals
、getClass
等方法,在日常开发中作用很大,Guava
中包含Objects
类,其提供了很多更为强大的方法。
Objects
Objects
是Object
的子类,其提供了equal
、toStringHelper
等方法,下面根据一个示例来分析源码。
示例
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 a
的equals
方法,若其重写了equals
方法,则调用自身方法,否则调用父类的equals
方法,直至最后Object
类的equals
方法。
toStringHelper方法
该方法是
Objects
中非常有用的方法,可以格式化对象的输出,一般情况下是重写toString
方法,然后将对象的属性逐一写出,而Objects
中提供了toStringHelper
方法,可以很方便的格式化输出。
toStringHelper
会生成一个ToStringHelper
对象,若传递的为非String
类型值,则首先会调用simpleName
方法简化类名,如传递的为整形3
,simpleName
方法则返回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
属性,用来保存类名,如Person
、Integer
等字符串;存在一个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
节点,并且使用ToStringHelper
的holderTail
对象指向尾节点。
toString方法
当打印时,会调用
ValueHolder
对象的toString
方法,其会首先输出className{
,然后遍历链表,将包含key-value
或只包含value
类型的节点按照指定格式输出,最后添加}
。
总结
Objects
类源码相对简单,其提供了格式化对象的方法,使用也非常简单,非常方便在实际开发的时候使用。
Guava-Objects使用的更多相关文章
- 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 ...
- Object Pascal中文手册 经典教程
Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...
- guava学习--Objects
转载:https://my.oschina.net/realfighter/blog/349821 Java中的Object类是所有Java类的超类(也就是祖先),所有对象都实现Object类中的方法 ...
- [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Guava学习笔记(二):基础(Joiner,Objects,Splitter及Strings)
添加Maven依赖 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org.junit ...
- Guava库介绍之实用工具类
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- Guava学习笔记(3):复写的Object常用方法
转自:http://www.cnblogs.com/peida/p/Guava_Objects.html 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals ...
- Guava学习笔记:复写的Object常用方法
在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- guava
原文出处: 黄博文 如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的 ...
随机推荐
- day73 中间件 以及模板引擎
模板引擎: 基本实用{{k1}} if for 模板中自定义函数:操作步骤 1在已经注册的App中创建一个名字叫templates文件夹 2任意创建一个py文件, 3创建名字叫register 的L ...
- 关于ACtion类利用file类型取得上传文件的内容,名字和内容类型
上面的Action提供了两个属性:uploadFileName和uploadContentType,这个两个属性分别用于封转上传文件的文件名.上传文件的文件类型.Action类直接通过File类型属性 ...
- 1402 后缀数组 (hash+二分)
描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现一个简单的 O(n log^2n ) 的后缀数组 ...
- 阿里 EasyExcel 使用及避坑
github地址:https://github.com/alibaba/easyexcel 原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel.EasyE ...
- Intellij IDEA 解决 Maven 依赖下载慢的问题
最近用 IDEA 导入 Hadoop 源码, 但下载依赖特别慢.导致经常需要重启 IDEA 并且下载的过程非常艰难, 网上找了一些方法,各种尝试,终于解决了这个问题.本篇文章总结最关键的两点,希望能帮 ...
- shell脚本中的set -e和set -o pipefail
工作中经常在shell脚本中看到set的这两个用法,但就像生活中的很多事情,习惯导致忽视,直到出现问题才引起关注. 1. set -eset命令的-e参数,linux自带的说明如下:"Exi ...
- linux相关操作命令
1.复制文件:cp -r file ./src 2.删除文件:rm -rf file 3.解压文件:tar -xvf bianque.tar.gz
- BZOJ.1115.[POI2009]石子游戏Kam(阶梯博弈)
BZOJ 洛谷 \(Description\) 有\(n\)堆石子.除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作,每次可以从一堆石子中拿掉任意多的石子,但要保证操作后仍然满足初始时 ...
- IDEA常用配置
一.安装Activiti 1.File -> Settings -> Plugins -> 搜索actiBPM 2.解决中文乱码问题 修改IDEA的安装目录中的idea.exe.vm ...
- 2017-9-15-Linux移植:WinSCP软件 & SSH Server开启
在Linux电脑上面安装了TFTP server,但是各种不给力,决定寻找其他办法在Windows和Linux之间传输文件. WinSCP 是一个 Windows 环境下使用 SSH 的开源图形化 S ...