Java中间缓存变量机制
2016-03-24 11:26
246 查看
在java中存在一个缓存变量机制,java会将临时的变量存储在缓存变量中,在自增和自减运算中都会用到java的缓存变量。
在《java程序员面试宝典》这本书中,就连续的用到了缓存变量机制。下面是转载自way菜哇的博客,写的很好,非常的详细。http://blog.csdn.net/waycaiqi/article/details/43486249 对java缓存变量不清楚的可以好好看看这篇博客。要在这里谢谢博主写出这么好的文章
看到第三版中5.2的例题4,一开始只是简单地接受中间缓存变量的机制,例题如下:[java] view
plain copy
public class Test {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++) {
j = j++;
}
System.out.println(j);
}
}
上述结果为0。解释如下:
[java] view
plain copy
1. temp=j;
2. j=j+1;
3. j=temp;
看到例题5里的题:int j = 0; j =++j + j++ +j++ + j++;结果等于7,就纳闷了,这里怎么不是“中间缓存变量的机制”最后j=0?
看了一些解释都说得不是很清楚。思考了下,发现原来“中间缓存变量的机制”是对单个表达式计算来说。如,题目5可分解为:
[java] view
plain copy
1. j = j+1; // (++j)的自增
2. temp1 = j =1; // (++j)表达式的结果的中间缓存变量
3. temp2 = j =1; //(j++)表达式的结果的中间缓存变量
4. j = j+1=2; // (j++)的自增
5. temp3 = j =2; //(j++)表达式的结果的中间缓存变量
6. j = j+1=3; // (j++)的自增
7. temp4 = j =3; //(j++)表达式的结果的中间缓存变量
8. j = j+1=4; // (j++)的自增
9. j = temp1 + temp2 + temp3 + temp4 = 1+1+2+3=7;
由上述分解可以很清楚的明白,对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区。因为本体是j的值,而单个表达式的值是中间产生的一个临时变量值,是在整条计算表达式结束后就可以抛弃的值,所以用个临时中间缓存变量在放就可以了。这就可以实现自增自减运算在计算时值的加减1顺序差异产生的表达式与本体值差异的两个变量储存!
想想这种机制也应该是Java设计者的一个慎重的考虑。作为程序设计者,在出现j=f(j)的表达式的时候,一定是要求f(j)整个表达式的最终值,而不是在过程中j被各种自增自减后的值(如果要这样,那f(*)就没意义,还不如直接保留j的各种自增自减而抛掉其他加减乘除的表达式),所以f(j)的值不能被j的各种增减覆盖,于是有个缓存区来保留表达式中设计者的原意。不过作为程序设计者,这种情况还是尽量少出现为妙,越简单直观的程序势必是越高质量的、越是高容错的!
有些面试题目虽然不是很高深,但是却还是需要细细琢磨,死记硬背是不会得到真正的提升的,加油!
相关文章推荐
- java驼峰转下划线
- JavaWeb(一)_JavaWeb开发入门
- Java虚拟机类加载机制
- java+selenium实现自动化打开页面
- Java基础学习第二十二天——转换流之字符流应用
- 【设计模式】java设计模式总述及观察者模式
- 【设计模式】java设计模式总述及观察者模式
- Scala学习6之scala与java的不同之总结2-重写override
- Java多线程-并发协作(生产者消费者模型)
- javaEE--web.xml拆分
- eclipse查看Android应用内存使用情况
- PageRank算法java实现版本
- springMVC不太注意的东西
- java 随笔1
- JAVA中线程Thread
- java final 关键字
- 【JAVA】递归调用(转)
- Java千百问_03基本语法(001)_局部变量、类变量、实例变量有什么区别
- Javax Mail发送邮件完整代码示例
- Java泛型