guava 复写Object常用方法

Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。

这些高质量的 API 可以使你的Java代码更加优雅,更加简洁,让你工作更加轻松愉悦。

一、概述

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

很多类库提供了覆写这几个方法的工具类, Guava也提供了类似的方式。下面我们来看看Guava中这几个方法简单使用。

Guava中Objects类提供了很多和Object类作用相同、效率更高的方法可供使用:

1、equal方法

使用Obejct的equals方法进行相等判断,例如:test.equals("test");如果test为null,则会发生NullPointerException,Objects的equal方法可以帮助你

避免NullPointerException,它的判断逻辑是这样的:return a == b || (a!=null&& a.equals(b));所以,可以很放心的使用,Objects.equal(test,"test")

当然在JDK7中也提供了同样判断逻辑的方法:Objects.equals(test,"test");

public class ObjectTest {

    @Test
public void equalTest() {
System.out.println(Objects.equal("a", "a"));
System.out.println(Objects.equal(null, "a"));
System.out.println(Objects.equal("a", null));
System.out.println(Objects.equal(null, null));
}
}
/**输出结果
* true
* false
* false
* true
*/

2、hashCode方法

对于hashCode首先要明白两点:

1、如果equals()判断两个对象相等,那么它们的hashCode()方法一定返回同样的值。

  2、并没有强制要求如果equals()判断两个对象不相等,它们的hashCode可以相同也可以不同。

Guava提供给我们了一个更加简单的方法--Objects.hashCode(Object ...), 这是个可变参数的方法,参数列表可以是任意数量,所以可以像这样

使用Objects.hashCode(field1, field2, ...,fieldn)。非常方便和简洁。

import org.junit.Test;
import com.google.common.base.Objects; public class ObjectTest {
@Test
public void hashcodeTest() {
System.out.println(Objects.hashCode("a"));
System.out.println(Objects.hashCode("a"));
System.out.println(Objects.hashCode("a","b"));
System.out.println(Objects.hashCode("b","a"));
System.out.println(Objects.hashCode("a","b","c")); Person person=new Person("peida",23);
System.out.println(Objects.hashCode(person));
System.out.println(Objects.hashCode(person));
}
} class Person {
public String name;
public int age; Person(String name, int age) {
this.name = name;
this.age = age;
}
}
//输出结果
128
4066
4096
126145
19313256
19313256

3、toStringHelper()方法

因为每个类都直接或间接地继承自Object,因此每个类都有toString()方法。这个方法是用得最多的, 覆写得最多, 一个好的toString方法对于调试来说是非常重要的,

但是写起来确实很不爽。Guava也提供了toString()方法。

通过toStringHelper方法来输出你需要输出的属性字段

import org.junit.Test;
import com.google.common.base.Objects; public class ObjectTest { @Test
public void toStringTest() {
//this代表当前类,这里只输出x一个属性字段
System.out.println(Objects.toStringHelper(this).add("x", 1).toString()); //代表输出对象为Person对象
System.out.println(Objects.toStringHelper(Person.class).add("x", 1).toString()); //add可以叠加
Person person=new Person("peida",23);
String result = Objects.toStringHelper(Person.class).add("name", person.name).add("age", person.age).toString();
System.out.print(result);
}
}
class Person {
public String name;
public int age; Person(String name, int age) {
this.name = name;
this.age = age;
}
}
//============输出===============
ObjectTest{x=1}
Person{x=1}
Person{name=peida, age=23}

4、firstNonNull方法

Object的firstNonNull方法可以根据传入的两个参数来返回一个非Null的参数,Guava现在推荐使用MoreObjects.firstNonNull(T first,T second)替代它。

import com.google.common.base.MoreObjects;

public class TestFilter {

    public static void main(String[] args) {
//name不为空
String name="张三";
String nann= MoreObjects.firstNonNull(name, "哈哈");
System.out.println(nann); //sex为null
String sex=null;
String sexx= MoreObjects.firstNonNull(sex, "哈哈");
System.out.println(sexx); }
/*
*运行结果:
* 张三
* 哈哈
*/
}

在实际开发中,Objects.equal(test,"test")和MoreObjects.firstNonNull(T first,T second)在许多实际场合还是非常有帮助的。

 想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【11】

java代码之美(3)---guava 复写Object常用方法的更多相关文章

  1. java代码(3)----guava复写Object常用方法

    guava复写Object常用方法 Guava是一个Google的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,字符串处理,I/O和验证的实用方法, 这些高质量的 ...

  2. java代码之美(14)---Java8 函数式接口

    Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...

  3. java代码之美(15)---Java8 Function、Consumer、Supplier

    Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...

  4. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  5. java代码之美(8)---guava字符串工具

    guava字符串工具 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 一.Joiner 根据给 ...

  6. java代码之美(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...

  7. java代码之美(9)---guava之Lists、Maps

    guava之Lists.Maps 谷歌提供了guava包里面有很多的工具类,Lists和Maps集合工具,集合操作做了些优化提升. 1.概述 1.静态工厂方法 (1)Guava提供了能够推断范型的静态 ...

  8. java代码之美(7)---guava之Bimap

    guava之Bimap bimap的作用很清晰:它是一个一一映射,可以通过key得到value,也可以通过value得到key. 一.概述 1.bimap和普通HashMap区别 (1)在Java集合 ...

  9. java代码之美(6)---guava之multimap

    guava之multimap 上一篇讲到Multiset它可以对存入相同元素做一个计数的功能,那multimap呢? 一.概述 1.基本介绍和案例说明 multimap和MultiSet的继承结果很相 ...

随机推荐

  1. phpmail发送phpexcel生成的附件,php导出的Excel 作为邮件附件发送

    PHP发送邮件戳这里https://www.cnblogs.com/wangzhaobo/p/8931328.html PHP导出excel戳这里https://www.cnblogs.com/wan ...

  2. 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?

    2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm   据泰尔终端实验室公众微信 ...

  3. 【redis】在dotnet core下的redis的使用

    1.Install-Package Microsoft.Extensions.Caching.Redis -Version 2.2.0 2.注入 services.AddDistributedRedi ...

  4. java -ui自动化初体验

    本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...

  5. [Tips]vim设置

    临时设置 在vim中输入 :set nu! 若显示行号时,它的功能时取消行号:若不显示行号时,它的功能是显示行号. 固定设置 在~/.vimrc中进行设置. 添加注释: 双引号是注释 ” this i ...

  6. VMware Workstation安装Red hat7.0联网问题总结

    1.在red hat7当中iconfig命令是被取消了的,开发者用ip addr命令取代了ifconfig命令. 当然也是可以用ifconfig命令的 (前提是你安装的linux是可以联网的): 1) ...

  7. 用clumsy模拟丢包测试socket库的失败重传

    用python的socket库写了通信小程序,现在我需要通过软件模拟出在网络极差的情况下,socket底层解决丢包问题的能力怎么样,我一开始想的是分别在linux和windowns下分别测试,后来一想 ...

  8. 最简单的原生js和jquery插件封装

    最近在开发过程中用别人的插件有问题,所以研究了一下,怎么封装自己的插件. 如果是制作jquery插件的话.就将下面的extend方法换成  $.extend 方法,其他都一样. 总结一下实现原理: 将 ...

  9. css实现中文换行,英文换行,超出省略

    英文换行时,是以单词换行,在对应的标签添加对应的属性即可 1 word-break:break-all;只对英文起作用,以字母作为换行依据 2 word-wrap:break-word; 只对英文起作 ...

  10. Go语言基础之接口

    Go语言基础之接口 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口介绍 在Go语言中接口(interface)是一种类型,一种抽象的类 ...