看了lz之后特地去试了。发现很有趣的东西。lz写法其实有错,float的话数字后面要加f。
2看来是一个很特别的数字,你去试一下int其实同样的位置是iconst_2和bipush。int的话不是常量池没有,应该是没在那里显示,String也是一样的。
但是double的情况又是和float的一样。
2看来是一个很特别的数字,你去试一下int其实同样的位置是iconst_2和bipush。int的话不是常量池没有,应该是没在那里显示,String也是一样的。
但是double的情况又是和float的一样。
看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都是有对应的常量指令的,所以当然也不会到常量池去。
比如:
Java Virtual Machine Specification
深入理解Java虚拟机
另外StackOverflow上的很多答案也比较专业,虽然这网站比较烦。。