面试笔试整理

1.什么是内存泄漏

一句话:对象被创建了,占用了内存,但是JVM的垃圾回收却无法回收这些内存!

比如说在这段代码中

Vector vt = new Vector();
for(int i=0;i<10;i++){
    Object o = new Object();
    vt.add(o);
    o = null;
}    

o = null仅仅是释放的了这个引用本身,但是这个对象仍然被放在vt中,所以这个对象对GC来说是不可回收的.

如果要回收,需要把这个对象从vt中删除,或者直接把vt设置为null.

 

2.递归和循环的异同

  概念 原理 内存 结构
递归 直接或间接调用自身的算法
递归函数的内部执行过程    一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。
为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:
 (1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
 (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
 (3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 
          因为递归是调用本身,程序要为每一个函数都开辟一个空间,那么多次调用本身,就会开辟有多个内存空间,从而也造成了效率低下                    代码架构简单易懂,但是因为内存花销大,导致效率低
循环 在某个条件下,重复执行一段代码   开辟一个方法的内存空间即可 代码相对复杂,效率高

 3.缓存

  缓存是一种数据结构,用于快速查找已经执行的操作结果。

       什么时候需要使用缓存:对于一些经常操作的结果,把它们缓存起来,下次要使用时,直接取出即可。

    缓存一般使用的算法如下:

       1.检查一下结果在缓存中有没有,如果有,直接取出使用。

        2.如果没有结果在缓存中,就结算结果。

  3.如果缓存中所占资源过大,就把时间最久的结果清除。

  4.将2中计算的结果添加到缓存中去,以便下次调用。

 

posted @ 2017-10-19 17:32  黄仁超  阅读(108)  评论(0)    收藏  举报