Today I came cross a strange performance behaviour with BigDecimal. In a simple word, there is a significant difference between the following two pieces of code trying to do the same thing
int hash = foo();
BigDecimal number = new BigDecimal(hash);
vs
BigDecimal number = new BigDecimal(foo());
to prove it, I have the class below to show the difference. My java is 1.7.0_75-b13, 64 bit, mac. In my environment, the first loop took 2s, second loop took 5s.
import java.math.BigDecimal;
public class Crazy {
public static void main(String[] args) {
    new Crazy().run();
}
void run() {
    // init
    long count = 1000000000l;
    // start test 1
    long start = System.currentTimeMillis();
    long sum = 0;
    for (long i=0; i<count; i++) {
        sum = add(sum);
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
    // start test 2
    long start2 = end;
    sum = 0;
    for (long i=0; i<count; i++) {
        sum = add1(sum);
    }
    long end2 = System.currentTimeMillis();
    System.out.println(end2 - start2);
}
long add(long sum) {
    int hash = hashCode();
    BigDecimal number = new BigDecimal(hash);
    sum += number.longValue();
    return sum;
}
long add1(long sum) {
    BigDecimal number = new BigDecimal(hashCode());
    sum += number.longValue();
    return sum;
}
}
javap output
long add(long);
Code:
   0: aload_0       
   1: invokevirtual #56                 // Method java/lang/Object.hashCode:()I
   4: istore_3      
   5: new           #60                 // class java/math/BigDecimal
   8: dup           
   9: iload_3       
  10: invokespecial #62                 // Method java/math/BigDecimal."<init>":(I)V
  13: astore        4
  15: lload_1       
  16: aload         4
  18: invokevirtual #65                 // Method java/math/BigDecimal.longValue:()J
  21: ladd          
  22: lstore_1      
  23: lload_1       
  24: lreturn       
long add1(long);
Code:
   0: new           #60                 // class java/math/BigDecimal
   3: dup           
   4: aload_0       
   5: invokevirtual #56                 // Method java/lang/Object.hashCode:()I
   8: invokespecial #62                 // Method java/math/BigDecimal."<init>":(I)V
  11: astore_3      
  12: lload_1       
  13: aload_3       
  14: invokevirtual #65                 // Method java/math/BigDecimal.longValue:()J
  17: ladd          
  18: lstore_1      
  19: lload_1       
  20: lreturn      
 
     
    