java-ToStringBuilder介绍

之前都是直接toString,今天看到了ToStringBuilder就想知道他的用处。

简单介绍:

1、

项目中一般都需要打印日志,所有实体的toString()方法都是用简单的"+",因为每"+" 一个就会 new 一个 String 对象,这样如果系统内存小的话会暴内存。使用ToStringBuilder就可以避免暴内存这种问题。

ToStringBuilder的reflectionToString方法:

  logger.info("请求数据:"+ToStringBuilder.reflectionToString(req));

2、

ToStringBuilder在包 common-lang 中,主要用于一个类的格式化输出。ToStringBuilder类中的append方法可以向该类添加基本类型、数组和对象 ,只有添加的方法才会被toString方法输出。

ToStringStyle类则是对输出的内容进行格式化。

详细讲解

一、简介与引入

1、ToStringBuilder、HashCodeBuilder、EqualsBuilder、ToStringStyle、ReflectionToStringBuilder、CompareToBuilder等这些类都是位于commons-lang.jar下面的,所以要使用这些类一定要导入commons-lang.jar。

2、为什么要使用ToStringBuilder?

 系统中一般都要打印日志的,因为所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个 String 对象,这样如果系统内存小的话会暴内存(前提系统实体比较多)。使用ToStringBuilder就可以避免暴内存这种问题的。

二、示例学习

1、ToStringBuilder的append方法

 ToStringBuilder类主要用于类的格式化输出。ToStringBuilder中append方法可以向该类添加基本类型、数组、和对象,只有添加的方法才会被toString输出。如:
class TaxReturn {
  private String ssn;
  private int year;
  private String lastName;
  private BigDecimal taxableIncome;
  // get/set方法省略
  public TaxReturn() {
  }
 public TaxReturn(String pSsn, int pYear, String pLastName, BigDecimal pTaxableIncome) {
    setSsn(pSsn);
    setYear(pYear);
    setLastName(pLastName);
    setTaxableIncome(pTaxableIncome);
  }
  public String toString() {
    return new ToStringBuilder(this).append("ssn", ssn).append("year", year).append("lastName",
        lastName).toString();
  }

  public int hashCode() {
    return new HashCodeBuilder(3, 7).append(ssn).append(year).toHashCode();
  }

  public boolean equals(Object pObject) {
    boolean equals = false;
    if (pObject instanceof TaxReturn) {
      TaxReturn bean = (TaxReturn) pObject;
      equals = (new EqualsBuilder().append(ssn, bean.ssn).append(year, bean.year)).isEquals();
    }
    return equals;
  }

  public int compareTo(Object pObject) {
    return CompareToBuilder.reflectionCompare(this, pObject);
  }

}

public class MainClass {

  public static void main(String[] pArgs) throws Exception {
     TaxReturn return1 = new TaxReturn("012-68-3242", 1998, "O‘Brien", new BigDecimal(43000.00));
     TaxReturn return2 = new TaxReturn("012-68-3242", 1999, "O‘Brien", new BigDecimal(45000.00));
     TaxReturn return3 = new TaxReturn("012-68-3242", 1999, "O‘Brien", new BigDecimal(53222.00));
     System.out.println("ToStringBuilder: " + return1.toString());
  }
}

运行结果如下:

ToStringBuilder: [email protected][ssn=012-68-3242,year=1998,lastName=O‘Brien]

2、ToStringBuilder的reflectionToString方法

 该方法主要是把类对应的基本属性和值输出来。如:

public class MainClass {

public static void main(String[] args) {
    MyClass one = new MyClass("Becker", 35);
    MyClass two = new MyClass("Becker", 35);
    MyClass three = new MyClass("Agassi", 33);

    System.out.println("One>>>" + one);
    System.out.println("Two>>>" + two);
    System.out.println("Three>>>" + three);

    System.out.println("one equals two? " + one.equals(two));
    System.out.println("one equals three? " + one.equals(three));

    System.out.println("One HashCode>>> " + one.hashCode());
    System.out.println("Two HashCode>>> " + two.hashCode());
    System.out.println("Three HashCode>>> " + three.hashCode());
}

}

class MyClass {

private String name = null;
private int age = 0;

public MyClass(String name, int age) {
    this.name = name;
    this.age = age;
}

public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

public String toString() {
    return ToStringBuilder.reflectionToString(this,
        ToStringStyle.MULTI_LINE_STYLE);
}

public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

}

运行结果如下:

One?>[email protected][

name=Becker

age=35

]

Two?>[email protected][

name=Becker

age=35

]

Three?>[email protected][

name=Agassi

age=33

]

one equals two? true

one equals three? false

One HashCode?> 462213092

Two HashCode?> 462213092

Three HashCode?> -530629296

ToStringStyle参数说明:

  1. DEFAULT_STYLE

    [email protected][name=John Doe,age=33,smoker=false]

  2. MULTI_LINE_STYLE 

    [email protected][

    name=John Doe

    age=33

    smoker=false

    ]

  3. NO_FIELD_NAMES_STYLE 

    [email protected][John Doe,33,false]

  4. SHORT_PREFIX_STYLE (即截去了包名) 

    Person[name=John Doe,age=33,smoker=false]

  5. SIMPLE_STYLE 

    John Doe,33,false

附加:

无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数。你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现。

  在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Websphere, Eclipse 等等。我们就从这个包开始介绍整个 common 项目。

Lang 中工具类比较多,这里介绍几个主要的:

  ClassUtils: getShortClassName,这个函数应该在 java.lang.Class 类中有的,我看到很多人自己写这个函数。getAllInterfaces,convertClassNamesToClasses,isAssignable,primitivesToWrappers,isInnerClass。

  NumberUtils: 关于数字以及数字和字符串转换的类 stringToInt,toDouble,createNumber,isAllZeros, int compare(float lhs, float rhs), isNumber(String str),double min(double[] array)。

  RandomUtils: 用于产生随机数的。

  DateFormatUtils: 日期时间格式转换,以及本地时间和 UTC 时间转换。

  DateUtils: 日期工具类。isSameDay,truncate,round,modify。

  基于反射机制的几个类:

  CompareToBuilder: 比较,用在算法、排序、比较的地方。reflectionCompare,append。

  EqualsBuilder: 通过反射机制比较。reflectionEquals 很多项目中用到。

  HashCodeBuilder: 可以通过反射生成 hash code,很多算法的地方涉及到 hash code,但是并不是每个人都知道一种 hash code 的生成方法。

  ToStringBuilder: 当你需要重载 toString 函数而不想写代码把当前类的所有成员信息列出来,可以用这个函数。

  其它的几个类我用得比较少:

  SerializationUtils Java中得序列化比较奥妙,容易出错啊。

  SystemUtils 可以读取一些关于 jdk 信息,操作系统信息的工具类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-17 16:49:22

java-ToStringBuilder介绍的相关文章

Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍,总结下来比较推荐,Visualvm,Perfino,yourkit和Jprofiler(推荐值按顺序依次递减),其它工具不太推荐使用.下面是文章目录结构:  一.VisualVm  1.简介 2 2.安装插件并启动VisualVM 2 3.内存分析 3 4.CPU分析 5 5.线程分析 6 6.连接

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

Java关键字介绍之this与super

1.什么是super?什么是this? super关键字表示超(父)类的意思.this变量代表对象本身. 2.使用super&this调用成员变量和方法 可以使用super访问父类被子类隐藏的变量或覆盖的方法.当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法.见示例1. 当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量.见示例2. 示例1 class Person { pro

Spark基础与Java Api介绍

原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html  一.Spark简介 1.什么是Spark 发源于AMPLab实验室的分布式内存计算平台,它克服了MapReduce在迭代式计算和交互式计算方面的不足. 相比于MapReduce,Spark能充分利用内存资源提高计算效率. 2.Spark计算框架 Driver程序启动很多workers,然后workers在(分布式)文件系统中读取数据后转化为RDD(弹性分布式数据集),最后对RD

<Java> java注解介绍

前言 在刚学java web开发的时候,我第一次看到注解不是在java里,而是在spring里,于是很长一段时间里,我都认为注解是spring特有的技术,后来用到mybatis的时候,发现也有不少注解,再加上经常在java中看到的@Override之类的,才怀疑注解是不是java的东西.可是怀疑归怀疑,但是开发都快一年多了,从来没有想过去了解注解这个东西,更别说开发自己的注解了. Java注解介绍 近来,项目中有许多额外的xml文件,我一直认为这是非常不好的,联想到spring可以将applic

HashSet HashTable HashMap的区别 及其Java集合介绍

(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap以(key-value)的一组对象作为元素,且HashSet拒绝接受重复的对象.HashMap可以看作三个视图:key的Set,value的Collection,Entry的Set. 这里HashSet就是其实就是HashMap的一个视图. HashSet内部就是使用Hashmap实现的,和Hash

流行的9个Java框架介绍: 优点、缺点等等

流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是您不需要从头编写Java程序.有许多优秀的Java框架可以编写在Java虚拟机上运行的web和移动应用程序.微服务和REST api. Java框架允许您关注应用程序的业务逻辑,而不是编写数据库连接或处理异常等基本功能.此外,如果您有Java方面的经验,您可以快速入门.这些框架都使用相同的语法,使用

java环境安装、配置环境变量、java工具介绍

1.java的安装 1.在官网下载JDK安装包,链接如下: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安装JDK,按照默认的方式安装JDK,只需一直点击下一步即可,此步省略 3.JDK安装成功之后,配置系统环境变量,通过右键点击计算机以此点击属性.高级系统设置.配置环境变量如下图所示: 4.点击环境变量之后会弹出一下窗口,点击新建 5.点击新建窗口之后分别输入JAVA

java基础介绍(转)

很全面的介绍JAVA基础的文档 Java 编程简介,第 1 部分: Java 语言基础 http://www.ibm.com/developerworks/cn/java/j-introtojava1/ Java 编程简介,第 2 部分: 构建真实的应用程序 http://www.ibm.com/developerworks/cn/java/j-introtojava2/

JAVA ClassLoader 介绍

java程序不是本地的可执行程序,它的执行依赖jvm,jvm运行后将 class 文件加载到jvm,然后才能在jvm内部运行.负责加载这些class的组件就是ClassLoader. JVM本身包含了一个ClassLoader称为**BootstrapClassLoader**,和JVM自身一样,**BootstrapClassLoader**是用本地代码(c/c++等)实现的,它负责加载核心Java  class(如rt.jar里的class).另外JVM还提供了两个ClassLoader,它