可以在应用程序中过于频繁地使用非原始的Integer / Long数据类型,会损害性能吗?

我在我的应用程序中经常使用Long / Integer数据类型来构建Generic数据类型。 我担心使用这些包装器对象而不是原始数据类型可能对性能有害,因为每次它需要创建一个昂贵的操作对象。 但似乎我没有其他选择(当我必须使用带有generics的原始物)而不是仅仅使用它们。
但是,如果你可以建议我能做些什么来改善它,那还是很棒的。 或任何方式,如果我可以避免它?

这也可能是什么缺点?

建议欢迎!

在我之后重复。 “用Java创建对象并不是一项昂贵的操作”

您过早地优化了您的应用程序。 更好的方法是使用IntegerLong以自然方式实现它,然后对其进行分析以确定瓶颈所在。 如果探查器告诉您使用IntegerLong是性能问题, 那么请查看解决此问题的方法。


如果您确定IntegerLong确实是一个问题,那么您可以执行以下操作:

  • 寻找一个实现原始类型“集合”的类库; 例如Trove。 但请注意,此类集合类型的API与java.util.Collection及其后代兼容。

  • 使用Integer.valueOf(int)Long.valueOf(long)而不是new Integer(int)new Long(long)valueOf方法使用常用对象的缓存来减少对象创建的数量。


@Rex Kerr的评论是,这是一个可怕的建议。 他(我认为)说OP应该优化他的应用程序以减少IntegerLong的使用,直到他知道这将是一个性能问题。 我不同意。

  • 此时(当他问这个问题时),OP并不知道他的应用程序需要优化。 如果应用程序运行“足够快”而没有任何优化,那么任何开发人员花在优化上的时间都会花在其他方面。

  • 此时,OP不知道性能瓶颈在哪里 。 如果他们不处理这些值,那么优化这方面将是浪费时间。 请注意,一般来说, 完全依靠直觉告诉您瓶颈在哪里或可能在哪里是一个坏主意。

  • @Rex Kerr认为,由于过度使用IntegerLong ,修改/重构代码以修复性能问题需要做很多工作。 这根本不是真的。 一个体面的IDE可以很容易地在中小型应用程序中进行这种更改。

如果您有许多集合或大型集合,则可能存在性能问题。 见http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf 。

如果您有许多集合,或大型集合,或许多大型盒装类型集合(例如Integer,Long),则有其他选择:一个是来自http://mahout.apache.org的Mahout Collections库。 Mahout集合有开放的哈希表,它解决了链接PDF中的许多问题,以及存储小整数等的集合。另一个是Trove,如果GPL不打扰你。

如果您不确定您的代码是否符合“很多”,“大”或“多大”的条件,那么请务必使用分析器查看发生了什么。

像其他人说的,

过早优化是邪恶的根源。

话虽如此,无论你在哪里,都喜欢原始类型到盒装类型 。

更新:可能还会补充说,根据开发人员使用高性能代码(如分布式缓存)拳击确实可以成为一个性能问题。 我还使用过高性能的应用程序。 但是从来没有把拳击确定为一个值得优化的地方。

您最好分析您的应用程序并查看您的瓶颈和热点所在。 这些在大多数时候都很难预测。 恕我直言如果你没有测量,你只是在猜测。

但是,如果您确定在集合中使用原语会更有效,我建议您尝试http://trove.starlight-systems.com/它可以在真正重要时产生很大的不同,但在90%的情况下,它没有。