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,是因为我喜欢简洁的 ...
随机推荐
- JAXB在Java 9/10并且使用Tomcat 9的问题
Implementation of JAXB-API has not been found on module path or classpath. JAXB API是java EE 的API,jav ...
- 第一章:python基础语法| 字符编码| 条件语句...
1.编程语言介绍 编程就是写代码,让计算机帮你做事情.计算机底层是电路,只认识二进制0和1.机器语言&汇编语言语言进化历史:机器.汇编.高级.机器语言只接受二进制代码:汇编语言是采用英文缩写的 ...
- K线图
1.程序 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- SSH框架学习------struts2(一)
1.总的目录 2.所有程序 1)index.jsp很简单 <%@ page language="java" contentType="text/html; char ...
- Bi-shoe and Phi-shoe (欧拉函数)
题目描述: 题目大意:一个竹竿长度为p,它的score值就是比p长度小且与且与p互质的数字总数,比如9有1,2,4,5,7,8这六个数那它的score就是6.给你T组数据,每组n个学生,每个学生都有一 ...
- 网络基础配置--开启SSH,关闭Telnet
1.Telnet和SSH对比 1.1.TELNET 使用Telnet这个用来访问远程计算机的TCP/IP协议以控制你的网络设备相当于在离开某个建筑时大喊你的用户名和口令.很快会有人进行监听,并且他们会 ...
- Topcoder的使用方法
http://acmicpc.info/archives/164?tdsourcetag=s_pctim_aiomsg(大家都推荐的一个指南, 但我觉得不好用) https://www.jianshu ...
- BZOJ.1812.[IOI2005]Riv 河流(树形背包)
BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...
- (文件操作)Android相关的File文件操作
判断文件是否存在: /** * 判断文件是否存在 * * @param path 文件路径 * @return [参数说明] * @return boolean [返回类型说明] */ public ...
- js数组根据指定字段(true or false)排序
const obj = [ {name:'1',bind:true}, {name:'2',bind:false}, {name:'3',bind:true}, {name:'4',bind:fals ...