一、数据类型类型
1.引用类型
值类型:直接存储数据
整形(int 4字节)、浮点型(单精度float 4字节、双精度double 8byte)、布尔型、字符型(char)、枚举型(enum)、结构类型(Struct)
引用类型:存储数据的引用(内存地址)
2.堆和栈
堆和栈:程序运行时的内存区域
把内存分为堆空间和栈空间
栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢
二、数据存储
一般来说,值类型存储在线程栈中;引用类型变量存储数据地址,数据实际存储在托管堆中
值类型作为类的成员变量在堆中存放,作为方法局部变量在栈中存放
引用类型(成员或局部)变量在栈中分配,引用类型实例在堆中存放
值类型的实例一般都分配在线程栈上,并且不受垃圾回收机制GC的影响,如果所有类型都是引用类型,那么每次使用一个数字都需要进行一次消耗巨大的内存分配,这个是得不偿失的。所以值类型的优势主要体现在了对提升日常开发中常用的、简单的类型的性能。
简而言之,相对于引用类型,值类型的使用缓解了托管堆的压力,并且减少了消耗巨大的垃圾回收的次数。
引用类型总是从托管堆分配,使用new操作符返回指向对象数据的内存地址
引用类型还会涉及到一个问题就是GC(垃圾回收),也就是当你使用new操作符分配内存空间的时候,有可能面临没有空间可用的情况,那么这时就会触发垃圾回收,这会非常消耗性能
三、例子
public class Test1()
{
int a = 0;(堆中 类内成员变量 值类型)
public run()
{
int b=1;(栈中 方法内局部变量 值类型)
}
}
public class Test2()
{
int i = 1;
//等号前仅创建了空指针在栈内
//new 后在堆内开辟空间并传给引用 此时Test1内的a作为引用类型的实例对象在堆内存放
Test1 t1 = new Test();
}