'this'关键字的开头

时间:2013-12-05 15:02:32

标签: java optimization code-readability

这似乎是一个常见问题,但我搜索了SO和Google,找不到我正在寻找的内容:

在Java中调用this关键字的开销是多少?我知道在C ++中由于解除引用当前对象指针而产生一些最小的开销。 Java会产生同样的开销吗?对this进行多次调用是否不太理想。这主要是可读性与优化的问题。

4 个答案:

答案 0 :(得分:6)

无论如何。它们都产生完全相同的字节码。例如,这个:

package test;

public class T {

    int a=0;

    public T() {
        System.out.println(a); //this line
    }

    public static void main(String[] args) {
        new T();
    }

}

...生产:

public class test.T {
  int a;

  public test.T();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iconst_0      
       6: putfield      #2                  // Field a:I
       9: getstatic     #3                  // Field     java/lang/System.out:Ljava/io/PrintStream;
      12: aload_0       
      13: getfield      #2                  // Field a:I
      16: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      19: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #5                  // class test/T
       3: dup           
       4: invokespecial #6                  // Method "<init>":()V
       7: pop           
       8: return        
}

...无论标记为此行的行是否使用athis.a。 (如果你愿意的话尝试一下 - 以两种方式编译上面的代码,并将这两个类文件与javap -c进行比较。)考虑到它们产生完全相同的字节码,性能不可能存在差异。

答案 1 :(得分:2)

如果您的意思是使用

private String myString;
public void doStringStuff() {
    this.myString xxxxx;
}

而不是

private String myString;
public void doStringStuff() {
    myString xxxxx;
}

那么字节码将是相同的,但它会更快地编译一小部分,因为编译器不需要检查寻找匹配的局部变量。

答案 2 :(得分:2)

如果您使用this,则可能会生成相同的字节码

但有时您必须使用this关键字(例如,当您有名称冲突时):

private int a;
public MyClass(int a) {
    this.a = a; //this is a must
}

为清楚起见,我认为这是一个品味问题。有些程序员喜欢看,有些则不喜欢。另请注意,this关键字,而不是运营商。

提示:对于非常小的事情,不要在性能问题上浪费时间。

答案 3 :(得分:0)

没有区别。如果你在方法a()和方法b()中调用A类,那么这些完全相同

public void a()
{
    this.b();
    b();
}

您正在谈论的开销是它取消引用指向对象的指针以读取或写入变量。想象一下,你想写一个班级成员a,你会这样做:

A x = new A();
x.a = 3;

在这里,您遇到了开销:写入x.a时,必须找出确切的位置。为了找到它,它必须在该类中使x和变量a的偏移量之和。所以,它可能是一样的总和:x + 0x10。现在,它可以写入与总和相对应的地址。这就是你谈论的开销。