当前位置: 代码迷 >> Java相关 >> 强制类型转换和new一个新对象有什么区别,该怎么处理
  详细解决方案

强制类型转换和new一个新对象有什么区别,该怎么处理

热度:21   发布时间:2016-04-22 20:47:47.0
强制类型转换和new一个新对象有什么区别
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指令直接进行了转换。
结论:第二种方法性能好。