值、引用类型相关面试题

      最近在面试过程中,发现好多工程师对值类型、引用类型还是缺乏有深度的理解。尤其是工作经验在5年以上的工程师,对于变量在内存中的分配细节,还是一知半解。

     下面是我随机出的面试题目:请简要阐述以下各变量间的区别。

     string a = "Hello";

     string b = "";

     string c = null;

     int i = 0;

 

     关键点有3个:

    1.值类型与引用类型的区别

    这个点大家都比较清楚,一般值类型分配在栈上面,引用类型分配在堆上面。

   

    但也有特殊情况:

    1)如果值类型变量定义在自定义类,作为字段属性,此时值类型变量分配在堆上面。

    2)结构体(值类型)中定义引用类型字段,结构体是存储在栈上,其引用变量字段只存储内存地址,指向堆中的引用实例。

   

   2.变量b与c的区别

   b、c均属于string引用类型变量,变量均分配在栈上面。区别在于b对应的值“”指向堆上面的一块内存区域;而c对应的值为空,为指向堆。

  

  

   3.变量c何时被回收,及引入GC相关知识点

   1)根据应用程序根指针遍历堆上的每一个引用对象,生成可达对象序列,对使用的对象进行标记(可达对象);

   2)针对所有不可达对象进行清除操作,针对普通对象直接回收内存,而实现了析构函数的对象需要单独回收处理;

   3)把剩下的对象转移到一个连续的内存。

   GC相关内容,后续详细介绍。

posted @ 2016-03-14 15:58  才宽  阅读(236)  评论(0)    收藏  举报