这个基本可以忽略不计。
public class Test37 {
private volatile int testi = 0;   //为了防止程序做一些优化,定义成volatile public void setTesti(int testi) {
this.testi = testi;
} public static void main(String[] args) {
Test37 t = new Test37();
long l1 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.testi = i;
}
long l2 = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
t.setTesti(i);
}
long l3 = System.currentTimeMillis(); System.out.printf("l1=%d,l2=%d,l3=%d,l2-l1=%d,l3-l2=%d", l1, l2, l3, l2
- l1, l3 - l2);
}
}
在我的机器上连续测试4次,每次的结果基本上都很接近,结果应该还是可以采信的。可见直接给属性赋值与通过set方法进行赋值在性能上基本可以忽略不计,当然这样测试有不科学的地方,set方法可能会占用更多的内存,我的测试结果只能表明占用的cpu时间基本一致,却无法测试内存的暂用情况,不过我想相对于一个企业应用来说,这种性能开销也是忽略不计的。l1=1414375853125,l2=1414375853750,l3=1414375854359,l2-l1=625,l3-l2=609
l1=1414375939281,l2=1414375939953,l3=1414375940625,l2-l1=672,l3-l2=672
l1=1414375954953,l2=1414375955593,l3=1414375956250,l2-l1=640,l3-l2=657
l1=1414375968078,l2=1414375968718,l3=1414375969359,l2-l1=640,l3-l2=641

解决方案 »

  1.   

    就是一次压栈弹栈的过程  现在的CPU对这个处理不算事儿
    但是问题在于  get set有什么用呢  你写private的  人家想改一样能改
      

  2.   

    谢谢rumlee!
    偶已运行Test37
    偶发觉如果把volatile删掉,运行时间变短,而且l2 - l1明显小于 l3 - l2
      

  3.   


    这是因为如果没有volatile的话,程序自己将会优化,认为那么多次循环毫无意义,只有最后一次赋值才会被真正执行。而方法却每次都会被调用。