我对你们所有人都有一个愚蠢的问题。给出以下Java代码
public void funct(String a) {
byte[] bytearr;
bytearr = new byte[a.getBytes().length];
bytearr = a.getBytes();
}
新通话是否有任何改变?特别是,代码的处理方式与
public void funct(String a) {
byte[] bytearr;
bytearr = a.getBytes();
}
我问是因为,当执行时,两者都呈现出相同的结果,如果
谢谢!
问题来源:Stack Overflow
它们是不同的,让我们看一下字节码:
1.版本:
L0
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ARRAYLENGTH
NEWARRAY T_BYTE
ASTORE 1
L1
LINENUMBER 10 L1
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ASTORE 1
L2
LINENUMBER 11 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
LOCALVARIABLE bytearr [B L1 L3 1
MAXSTACK = 2
MAXLOCALS = 2
2.版本:
L0
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ASTORE 1
L1
LINENUMBER 10 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE bytearr [B L1 L2 1
MAXSTACK = 2
MAXLOCALS = 2
区别在于,这些指令来自额外的行:
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ARRAYLENGTH
NEWARRAY T_BYTE
ASTORE 1
这引入了额外的开销(getBytes被调用两次,更多指令)。通过调用bytearr = a.getBytes()jvm,已经可以处理要存储的数组的大小。
但是由于第一次初始化是多余的,因此编译器可能会在某个时候(经过足够的运行)对其进行优化。仍然不需要额外的指令和可读性较低的代码。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。