import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args){
Map<String,Object> m = new HashMap<String,Object>();
m.put("B",BigDecimal.ONE);
BigDecimal b1 = new BigDecimal(m.get("B").toString());
BigDecimal b2 = (BigDecimal)m.get("B");
System.out.println("b1="+b1+"\nb2="+b2);
}
}
结果:
b1=1
b2=1
BigDecimal b1 = new BigDecimal(m.get("B").toString());
BigDecimal b2 = (BigDecimal)m.get("B");
这两种写法有什么区别?内存中如何分配的
------解决思路----------------------
方式一有两个对象的应用
方式二只有一个
------解决思路----------------------
LINENUMBER 11 L2
NEW java/math/BigDecimal
DUP
ALOAD 1
LDC "B"
INVOKEINTERFACE java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object;
INVOKEVIRTUAL java/lang/Object.toString ()Ljava/lang/String;
INVOKESPECIAL java/math/BigDecimal.<init> (Ljava/lang/String;)V
ASTORE 2
L3
LINENUMBER 12 L3
ALOAD 1
LDC "B"
INVOKEINTERFACE java/util/Map.get (Ljava/lang/Object;)Ljava/lang/Object;
CHECKCAST java/math/BigDecimal
ASTORE 3
从字节看,第一种方法多调用了一次toString方法,同时调用了一次BigDecima.init方法生产结果。
第二种方法 java虚拟机 CHECKCAST指令直接进行了转换。
结论:第二种方法性能好。