可能是简单的问题,但我很困惑
优化了哪些代码?我应该使用吗?
内部流程有什么区别?
String str = editText.getText().toString();
str =str.trim().toLowerCase();
textView.setText(str);
textView.setText(editText.getText().toString().trim().toLowerCase());
不要以为把所有的东西都放在一行,就比把语句分成多行好。通常,Java 编译器足够聪明,可以在两种情况下生成完全相同的字节码。现代编译器做了很多微优化。
您可以通过编译它们来检查是否存在差异,然后使用 command 反编译字节码javap -c
。
我刚刚测试过,结果如下:
String str = editText.getText().toString();
str = str.trim().toLowerCase();
textView.setText(str);
编译为:
0: aload_0
1: getfield #7 // Field textView:Landroid/widget/TextView;
4: aload_0
5: getfield #4 // Field editText:Landroid/widget/EditText;
8: invokevirtual #8 // Method android/widget/EditText.getText:()Landroid/text/Editable;
11: invokevirtual #9 // Method java/lang/Object.toString:()Ljava/lang/String;
14: invokevirtual #10 // Method java/lang/String.trim:()Ljava/lang/String;
17: invokevirtual #11 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
20: invokevirtual #12 // Method android/widget/TextView.setText:(Ljava/lang/CharSequence;)V
23: return
第二个:
textView.setText(editText.getText().toString().trim().toLowerCase());
给出以下结果:
0: aload_0
1: getfield #7 // Field textView:Landroid/widget/TextView;
4: aload_0
5: getfield #4 // Field editText:Landroid/widget/EditText;
8: invokevirtual #8 // Method android/widget/EditText.getText:()Landroid/text/Editable;
11: invokevirtual #9 // Method java/lang/Object.toString:()Ljava/lang/String;
14: invokevirtual #10 // Method java/lang/String.trim:()Ljava/lang/String;
17: invokevirtual #11 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
20: invokevirtual #12 // Method android/widget/TextView.setText:(Ljava/lang/CharSequence;)V
23: return
如您所见,我猜对了,它们是相同的。Java 编译器优化了第一个示例并完全删除了该变量,因为它无用。
所以结论是你应该使用你觉得更易读的代码。
[1]创建String str占用设备内存,但以后也可以使用;因此,如果您稍后需要它,那么它会被优化。
[2]不使用内存,所以简单优化,但是你稍后需要这个字符串,然后你必须一直获取它,所以完成这个过程需要更多的机器周期,在这种情况下,第二个优化程度较低.
首先,您将输出存储在 String 变量中,以便它占用空间,然后将其转换为小写并设置为 textview。
在第二个选项中,您设置为 textview 而不将其存储到任何变量中。
因此,如果您不想在进一步编码中使用第二个选项,则更可取。
在第一个中,您使用额外的变量,它比第二个使用更多的内存。至于第二个有内存效率的优势
好吧,第二个虽然具有更高的内存效率优势,但可读性较差。不为对象分配引用变量会使它们更适合垃圾收集。
但是不用说,您应该更喜欢可读性而不是这样的小优化。
在第一个中,您使用了一个额外的变量,它比第二个需要更多的内存。