6

可能是简单的问题,但我很困惑

优化了哪些代码?我应该使用吗?

内部流程有什么区别?

String str = editText.getText().toString();     
str =str.trim().toLowerCase();
textView.setText(str);

textView.setText(editText.getText().toString().trim().toLowerCase());
4

6 回答 6

4

不要以为把所有的东西都放在一行,就比把语句分成多行好。通常,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 编译器优化了第一个示例并完全删除了该变量,因为它无用。

所以结论是你应该使用你觉得更易读的代码。

于 2012-07-28T09:32:23.190 回答
2

[1]创建String str占用设备内存,但以后也可以使用;因此,如果您稍后需要它,那么它会被优化。

[2]不使用内存,所以简单优化,但是你稍后需要这个字符串,然后你必须一直获取它,所以完成这个过程需要更多的机器周期,在这种情况下,第二个优化程度较低.

于 2012-07-28T09:23:17.320 回答
1

首先,您将输出存储在 String 变量中,以便它占用空间,然后将其转换为小写并设置为 textview。

在第二个选项中,您设置为 textview 而不将其存储到任何变量中。

因此,如果您不想在进一步编码中使用第二个选项,则更可取。

于 2012-07-28T09:19:12.113 回答
1

在第一个中,您使用额外的变量,它比第二个使用更多的内存。至于第二个有内存效率的优势

于 2012-07-28T09:47:05.393 回答
-1

好吧,第二个虽然具有更高的内存效率优势,但可读性较差。不为对象分配引用变量会使它们更适合垃圾收集。

但是不用说,您应该更喜欢可读性而不是这样的小优化。

于 2012-07-28T09:26:03.810 回答
-2

在第一个中,您使用了一个额外的变量,它比第二个需要更多的内存。

于 2012-07-28T09:20:05.443 回答