可能是一个简单的问题,但我很困惑
哪些代码优化了?我应该用吗?
内部流程有什么不同?
String str = editText.getText().toString();
str =str.trim().toLowerCase();
textView.setText(str);
Run Code Online (Sandbox Code Playgroud)
textView.setText(editText.getText().toString().trim().toLowerCase());
Run Code Online (Sandbox Code Playgroud)
不要认为将所有内容放在一行中会比将语句拆分为多行更好。一般来说,Java 编译器足够聪明,可以在两种情况下生成完全相同的字节码。现代编译器做了很多微观优化。
您可以通过编译它们来检查是否存在差异,然后使用命令反编译字节码javap -c。
我刚刚测试过,结果如下:
String str = editText.getText().toString();
str = str.trim().toLowerCase();
textView.setText(str);
Run Code Online (Sandbox Code Playgroud)
编译为:
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
Run Code Online (Sandbox Code Playgroud)
第二个:
textView.setText(editText.getText().toString().trim().toLowerCase());
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我猜对了,它们是相同的。java编译器优化了第一个示例并完全删除了无用的变量。
所以结论是你应该使用你认为更具可读性的代码。
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |