看了lz之后特地去试了。发现很有趣的东西。lz写法其实有错,float的话数字后面要加f。
2看来是一个很特别的数字,你去试一下int其实同样的位置是iconst_2和bipush。int的话不是常量池没有,应该是没在那里显示,String也是一样的。
但是double的情况又是和float的一样。

解决方案 »

  1.   

    这是优化问题。。不过你这个问题不懂意义在哪
    http://cs.au.dk/~mis/dOvs/jvmspec/ref-_ldc.html下面的Notes第一条
    1. Where possible, its more efficient to use one of bipush, sipush, or one of the const instructions instead of ldc.
    说的是bipush sipush和其他常量指令(比如你这里的fconst_2)比ldc效率更高,因为ldc需要从常量池里提取数据,所以速度慢,byte和short类型的常量一般都不会存到常量池去(也就是-32768 ~ 32767,所以你可能发现有些整数不在常量池里,但并不是所有int,你可以试试大一点的比如1234567),因为有bipush和sipush这两个效率更高的指令。至于float,0,1,2都是有对应的常量指令的,所以当然也不会到常量池去。
      

  2.   

    大概理解了 你意思是这样的吧 每个基本类型都预先定义好了,比如float是 fconst_0 fconst_1 fconst_2所以当我定义的float当伟0 1 2 的时候优先用的是这几个指令 如果float不在0 1 2 里面则用ldc命令吧  int的话 预先定义的是iconst_m1 iconst_0 iconst_1 iconst_2 iconst_3 iconst_4 iconst_5  所以如果变量的值在-1到5直接 则直接使用iconst命令吧,然后如果int超过5则优先使用byte的bipush命令 如果超过了byte的最大值127 则就用short的是sipush 在如果超过了short的最大值就用ldc把常量池里面的推到栈顶吧 总之ldc应该是最慢的然后是sipush 然后是bipush  然后iconst是最快的吧?
      

  3.   

    还有我发现int有iconst -》bipush-》sipush-》ldc的递进,为什么long只有lconst-》lsd2-w呢?为什么他不也先bipush和sipush呢?
      

  4.   

    bipush和sipush的值都是32位的当然不能给long用,也就是说他们只能往栈里送32位数据,而long需要64位,如果要用bipush和sipush,那还得再用一个iconst_0来补齐64位,这样的话速度优势就没了,反倒把结构弄得很糟糕,所以还不如直接用常量池。l
      

  5.   

    bipush和sipush的值都是32位的当然不能给long用,也就是说他们只能往栈里送32位数据,而long需要64位,如果要用bipush和sipush,那还得再用一个iconst_0来补齐64位,这样的话速度优势就没了,反倒把结构弄得很糟糕,所以还不如直接用常量池。l哈哈 明白了大神啊这些东西你是从哪里学来的? 我也去看下学习下 
      

  6.   

    写几个代码实验一下配合Google找的资料证实呗。。
    比如:
    Java Virtual Machine Specification
    深入理解Java虚拟机
    另外StackOverflow上的很多答案也比较专业,虽然这网站比较烦。。