Guava Vs Apache Commons Hash/Equals builders

时间:2015-06-25 18:44:20

标签: java guava apache-commons

I was wondering what are key differences between Guava vs Apache Commons with respect to equals and hashCode builders. equals: Apache Commons: public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } MyClass other = (MyClass) obj; return new EqualsBuilder() .appendSuper(super.equals(obj)) .append(field1, other.field1) .append(field2, other.field2) .isEquals(); } Guava: public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } MyClass other = (MyClass) obj; return Objects.equal(this.field1, other.field1) && Objects.equal(this.field1, other.field1); } hashCode: Apache Commons: public int hashCode() { return new HashCodeBuilder(17, 37) .append(field1) .append(field2) .toHashCode(); } Guava: public int hashCode() { return Objects.hashCode(field1, field2); } One of the key difference appears to be improved code readability with Guava's version. I couldn't find more information from https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained. It would be useful to know more differences (especially any performance improvement?) if there are any.

2 个答案:

答案 0 :(得分:19)

我称之为差异"存在"。 Apache Commons中有EqualsBuilderHashCodeBuilder,而番石榴中没有构建器。您从Guava获得的只是一个实用工具类MoreObjects(从Objects重命名,因为现在JDK中有这样的类。)

番石榴方法的优点来自于建造者的不存在:

  • 它不会产生垃圾
  • 它更快

JIT编译器可以通过Escape Analysis消除垃圾以及相关的开销。然后他们得到同样快的速度。

我个人认为构建者的可读性稍差。如果您发现没有更好地使用它们,那么番石榴肯定是适合您的。如您所见,静态方法足以完成任务。

另请注意,还有一个ComparisonChain,它是一种Comparable-builder。

答案 1 :(得分:0)

Guava在后台使用Arrays.hashCode()。 Varagrs会导致性能下降,并且可能会出现自动装箱的情况,这也会再次造成性能下降。根据Java的documentation

如果数组包含其他数组作为元素,则哈希码基于其标识而不是其内容

Objects.hasCode的替代方法可能是Objects.deepHashCode,但Guava并未采用。并且在循环引用的情况下有一个缺点

因此,在包含自身作为元素的数组上调用此方法是不可接受的

通常,Apache Commons的工作方式与deepHashCode相似,但可能会增加图像的反射效果并解决所有上述问题,但是(可以说)性能可能会更差。

表单设计观点Apache Commons实现了有效Java项目10和11制定的规则。这给它带来了非常不同的感觉