哪种是优化方式?

时间:2012-07-28 09:16:31

标签: java android

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

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

内部流程有何不同?

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

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

6 个答案:

答案 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)

在第一个使用附加变量时,它占用的内存比第二个更多。