java中接收double绝对值的最快方法是什么?

java中接收double绝对值的最快方法是什么?,java,absolute,Java,Absolute,我使用的代码如下: Double getabsValue(final Object[] value){ if (value==null) return null; if (value.lengt==0) return null; final Double absValue=Maths.abs(value[0]); if (absValue>0) return absValue else return null; 但在我的应用程序中,我的性能有问题。 如何对其进行优化 也许更好用 i

我使用的代码如下:

Double getabsValue(final Object[] value){

if (value==null) return null;
if (value.lengt==0) return null;

final Double absValue=Maths.abs(value[0]);

if (absValue>0) return absValue
else return null;
但在我的应用程序中,我的性能有问题。 如何对其进行优化

也许更好用

if (absValue>0) return absValue
else return absValue<0?-absValue:null;
if(absValue>0)返回absValue

否则返回absValue好吧,你现在得到的代码甚至不会编译-据我所知没有
Math.abs(Object)
调用。然而,假设你真的有一个双倍的演员阵容,你将一直在拳击。可以在值已经大于0时避免装箱,并在值为0时避免调用,如下所示:

static Double getAbsValue(Object[] values) {
    if (values == null || values.length == 0) {
        return null;
    }
    Double value = (Double) values[0];
    return value > 0 ? value
         : value == 0 ? null
         : -value;
}
当我们到达最后一个选项时,我们已经知道该值为负值,因此我们不再需要调用
abs

现在还不清楚这里的背景是什么。您说您有一个性能问题,但这段代码中肯定有这个问题吗

编辑:您的最新代码显示:

if (absValue>0) return absValue
else return -1*absValue;
这与原来的代码不同,如果数组包含一个装箱的0值,它不会返回null

在执行之前,您应该关注正确性。

您希望您的代码对0的输入做什么?如果希望它返回0,则我将使用:

return value >= 0 ? value : -value;
如果希望它返回null,请使用我最初提供的代码

顺便问一下,为什么要包含一个-1乘法,而不仅仅是使用一元否定运算符?我希望编译器或JIT都能解决这个问题,但从根本上说,你不想执行乘法——你想执行求反。尽可能仔细地阅读代码,了解如何描述目标

我使用的代码如下:

Double getabsValue(final Object[] value){

if (value==null) return null;
if (value.lengt==0) return null;

final Double absValue=Maths.abs(value[0]);

if (absValue>0) return absValue
else return null;
为什么?

我要做的第一件事就是重新定义签名

  • 当对象基本上必须是
    Double[]
    或至少是包含Double的
    对象[]
    时,指定
    对象[]
    是没有意义的,否则它将抛出ClassCastException
  • 为什么只使用第一个元素时指定数组
  • 当你真正需要的是双倍密码时,为什么要双倍密码
因此,我会重新定义它,使其接受类型为
double
的单个参数。这将把从数组中取出内容的开销移回到调用者可以看到的地方。他甚至可能没有数组,所以他必须构造它来调用这个方法。他可能已经有了一个double而不是double,在这种情况下,他或编译器将不得不把它装箱成double

我用它做的第二件事是回顾这次改变后剩下的东西。该更改消除了空值和长度检查以及类型转换,因此只剩下
返回Math.abs(d)因此,很明显,整个方法基本上是毫无意义的


因此,我要做的第三件事是删除它。

您如何确定
Math.abs()
是性能瓶颈?此代码是否编译?它不应作为
java.math.math#abs(…)
不允许将
对象
作为参数。它不会比您的最新编辑更快,即
如果(absValue>0)返回absValue,否则返回-1*absValue@Shahzeb:事实上,它可能。。。使用
=0
可以避免在0的情况下调用
Double.valueOf
,也可能是一种更快的比较(我怀疑它只需要检查一个位)。我不知道是否有
Double.valueOf(0)
的缓存值,但如果没有,如果值经常为0,则装箱可能会产生重大影响。@JonSkeet感谢您提出这一点,是像您这样的人造就了今天的局面。抱歉,我忘记了将其转换为(Double)@user710818:如果您要强制转换为
Double
,那么这种方法中进行的自动装箱和自动取消装箱(可能在整个代码中)对性能的影响比调用
Math.abs()
要大得多。描述一下,自己看看。@Joachim Sauer这当然是真的,但对于OP来说有办法解决它。@Shahzeb:如果他坚持只更改发布的代码,那么他不会走得太远。他可能需要做一些更大的修改。但是:他必须在改变任何事情之前对其进行分析。+1:正确性比表现更重要。无论你能以多快的速度做一些99.9%都不正确的事情。我想指出的是,使用
double
比使用
double
Object
更快,但我怀疑这并不重要,