一、数据类型类型

1.引用类型

值类型:直接存储数据

整形(int 4字节)、浮点型(单精度float 4字节、双精度double 8byte)、布尔型、字符型(char)、枚举型(enum)、结构类型(Struct)

引用类型:存储数据的引用(内存地址)

类、String、接口、数组委托

2.堆和栈

堆和栈:程序运行时的内存区域
把内存分为堆空间和栈空间
栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢

二、数据存储

一般来说,值类型存储在线程栈中;引用类型变量存储数据地址,数据实际存储在托管堆中
值类型作为类的成员变量在堆中存放,作为方法局部变量在栈中存放
引用类型(成员或局部)变量在栈中分配,引用类型实例在堆中存放

值类型的实例一般都分配在线程栈上,并且不受垃圾回收机制GC的影响,如果所有类型都是引用类型,那么每次使用一个数字都需要进行一次消耗巨大的内存分配,这个是得不偿失的。所以值类型优势主要体现在了对提升日常开发中常用的、简单的类型的性能
简而言之,相对于引用类型,值类型的使用缓解了托管堆的压力,并且减少了消耗巨大的垃圾回收的次数。

引用类型总是从托管堆分配,使用new操作符返回指向对象数据的内存地址
引用类型还会涉及到一个问题就是GC(垃圾回收),也就是当你使用new操作符分配内存空间的时候,有可能面临没有空间可用的情况,那么这时就会触发垃圾回收,这会非常消耗性能

三、例子

  1. public class Test1()
  2. {
  3. int a = 0;(堆中 类内成员变量 值类型)
  4. public run()
  5. {
  6. int b=1;(栈中 方法内局部变量 值类型)
  7. }
  8. }
  9. public class Test2()
  10. {
  11. int i = 1;
  12. //等号前仅创建了空指针在栈内
  13. //new 后在堆内开辟空间并传给引用 此时Test1内的a作为引用类型的实例对象在堆内存放
  14. Test1 t1 = new Test();
  15. }