在Java中,Integer对象是否应该优先于int原语(其他数值类型也是如此)?

在Java中,Integer对象是否应该优先于int原语(其他数值类型也是如此)?,java,performance,micro-optimization,Java,Performance,Micro Optimization,好的,我知道Integer只是一个包装类。然而,我担心的是,避免使用“包装器”,在使用原始ints变量时,可能会在执行时间上进行微观优化 我的问题是,整数对象真的是我们更喜欢使用的对象吗,特别是在需要有很好的性能的程序中(我是说,很重的,O(N^N)算法,需要几天的时间) 同样,double vs double、float vs float等的情况也一样。您应该尽可能地使用原语。否则他们就不存在了。Java开发人员甚至在开发(针对Java 8)支持基本类型(IntStream、LongStrea

好的,我知道Integer只是一个包装类。然而,我担心的是,避免使用“包装器”,在使用原始ints变量时,可能会在执行时间上进行微观优化

我的问题是,整数对象真的是我们更喜欢使用的对象吗,特别是在需要有很好的性能的程序中(我是说,很重的,O(N^N)算法,需要几天的时间)


同样,double vs double、float vs float等的情况也一样。

您应该尽可能地使用原语。否则他们就不存在了。Java开发人员甚至在开发(针对Java 8)支持基本类型(IntStream、LongStream、DoubleStream)的流方面付出了额外的努力,因此您不必为包装类使用引用类型流时所付出的多个装箱和取消装箱的性能代价付出代价


包装器仅适用于您没有选择的情况(例如,您不能将基元类型直接放入集合)。

更喜欢
int
而不是
Integer
,除非null是有效值或它将被放入集合中。

包装器类实例占用更多内存(包装值+引用),并生成一些方法调用,其中基元类型仅执行基本操作。但是,有些机制倾向于减少这种开销(例如,如果不使用
new
声明,则-128和127之间的
Integer
实例将保留在池中)。差别可能很小,但在可以使用原语的地方,只需遵循原则:不要使用提供更多所需功能的类。

不,大多数情况下,
int
Integer
更易于使用。是什么让你认为你应该一直使用
Integer
?这个问题已经得到了回答。事实上,我确实更喜欢原始类型,只是我开始看到人们使用Integer对象,而这些Integer对象“存在”的事实已经困扰了我一段时间。我想可能会有一些关于jvm实际工作原理的解释。需要注意的一点是:O(f(n))的全部要点是,对于大输入,与算法本身相比,特定对象的性能是可以忽略的。如果算法本身那么糟糕,像这样的优化就没有任何意义了。你不能放原语*@Dici谢谢你抓住了我的打字错误。当我快速打字时,我经常会写can或is,而不是can或isNp,这只是一个输入错误:)在旧Java中,是的,否则我认为
可选的
更具表现力……而健壮的原语可以保证编译时它是非空的。看起来(如果我错了,请纠正我)
可选
只是运行时检查。我以为您建议在希望整数值可能不存在(null)时使用
整数
,而
Optional
最适合处理没有任何类型值的情况。@Dici
Optional
是双重扭曲的,因为您有两个对象而不是一个。作为奖励,它也可能是
null
。@maaartinus您的第一个参数非常似是而非。一对
是邪恶的,因为它是三个对象而不是两个?重要的是程序的语义,而不是执行过程中对象的数量,只要它保持合理。是的,
Optional
可以是
null
,但至少您知道这不是故意的,而故意使用包装类型来使用
null
来表示没有值意味着
null
是可接受的值。这是非常糟糕的语义,其中
Optional
立即通知它们即使在正常执行中也可能没有价值