也许这是一个简单的问题,但我很困惑
哪段代码是优化的?我应该使用哪个?
内部流程有什么区别?
String str = editText.getText().toString();
str =str.trim().toLowerCase();
textView.setText(str);
textView.setText(editText.getText().toString().trim().toLowerCase());
也许这是一个简单的问题,但我很困惑
哪段代码是优化的?我应该使用哪个?
内部流程有什么区别?
String str = editText.getText().toString();
str =str.trim().toLowerCase();
textView.setText(str);
textView.setText(editText.getText().toString().trim().toLowerCase());
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编译器优化了第一个示例并完全删除了变量,因为它是无用的。
因此,结论是您应该使用您认为更易读的代码。
在第一个中,您使用额外的变量会比第二个使用更多的内存。就内存效率而言,第二个有优势。
嗯,第二种虽然具有更高的内存效率优势,但不太易读。不为对象分配引用变量使它们更适合进行垃圾回收。
但毫无疑问,您应该首选可读性而非这些小优化。
首先,你使用了一个额外的变量,这比第二种方法占用更多的内存。