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,是因为我喜欢简洁的 ...
随机推荐
- 053 kafka自带的生产者与消费者测试
1.命令 2.启动生产者 bin/kafka-console-producer.sh --topic beifeng --broker-list linux-hadoop01.ibeifeng.com ...
- CentOS7配置FTP服务器增强版~(零基础学会FTP配置)
ps:原文不知出处,但是原文也不能正常启动,这里做了一些修改!如果能正常配置请在下方留言让更多的人看到,因为之前我本人照着网上的教程安装卸载了十多次也无法正常使用,不希望后面的兄弟继续浪费时间,如果不 ...
- 转 U-BOOT之stage1
前言 本文主要是基于大家比较熟悉的 s3c2410 ,对移植 u-boot 时 stage1 过程进行一个分析,网上关于之方面的资料很多,但是几乎都只是对代码作注解,容易让人产生知其一不知其二的感觉, ...
- 基于AT89C51单片机烟雾传感器
#include <reg51.h> #include <stdio.h> #define uchar unsigned char //宏定义无符号字符型 #define ui ...
- 给json对象去除重复的值
给数组去除重复值 Array.prototype.distinct = function() { var arr = this, result = [], i, j, len = arr.length ...
- BZOJ3457 : Ring
根据Polya定理: \[ans=\frac{\sum_{d|n}\varphi(d)cal(\frac{n}{d})}{n}\] 其中$cal(n)$表示长度为$n$的无限循环后包含$S$的串的数量 ...
- DP专题:划分数问题
一.这个专题有什么用 练练DP 练练组合数学 ...... 二.正题 此类问题有如下几种形态: 1. 将n划分成若干正整数之和的划分数.2. 将n划分成k个正整数之和的划分数.3. 将n划分成最大数不 ...
- 3ds max学习笔记(八)-- 实例操作(直行楼梯)
1.选择要复制的物体,执行[工具]/[阵列]命令,弹出对话框: 2.参数说明: 应用: 1.[自定义]/[单位设置],将单位改为mm 在顶视图中,创建长方体,长1600,宽300,高度150 2.在前 ...
- HDU 4786 Fibonacci Tree 最小生成树
Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...
- react-native 报错 RawText "" must be wrapped in an explicit <Text> component
刚才又遇到了一个坑,找了好久,问题如下: 开始以为是Text标签怎么有问题了,结果是下面的原因影响的: 上图第二行,标签和注释中间多了一个空格,就会报这个错误. 解决办法 1.将空格删掉 <Re ...