可能是一个简单的问题,但我很困惑
哪些代码已优化?我应该使用吗?
内部流程有何不同?
String str = editText.getText().toString();
str =str.trim().toLowerCase();
textView.setText(str);
textView.setText(editText.getText().toString().trim().toLowerCase());
答案 0 :(得分:4)
不要以为如果你把所有东西都放在一行上,它会比你用多行分割语句更好。通常,Java编译器足够智能,可以在两种情况下生成完全相同的字节码。现代编译器进行了大量的微观优化。
您可以通过编译来检查是否存在差异,然后使用命令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 :(得分:2)
[1] 创建 String str 会占用设备的内存,但以后可以使用;因此,如果您以后需要它,那么它将进行优化。
[2] 不使用内存,如此简单地优化,但是您需要此字符串,然后您必须一直获取它,< / strong>所以需要更多的机器周期才能完成这个过程,在这种情况下,第二个更少优化。
答案 2 :(得分:1)
首先,您将输出存储在String变量中,以便占用空间 为此,然后将它转换为小写并设置为 TextView的。
在第二个选项中,您可以设置为textview而不将其存储到任何文本视图中 varible。
因此,如果您不想在进一步编码中使用它,则第二个选项更可取。
答案 3 :(得分:1)
在第一个使用额外变量时,它使用的内存多于第二个。据,直到...为止 第二个具有记忆效率的优势
答案 4 :(得分:-1)
嗯,第二个虽然具有更高的内存效率,但可读性较差。不为对象分配引用变量使它们更适合垃圾收集。
但可以说,你应该比这种小优化更容易阅读。
答案 5 :(得分:-2)
在第一个使用附加变量时,它占用的内存比第二个更多。