Ree*_*sey 13
在泛型中,例如List<T>,它们仍然存储在堆上.区别在于,在内部,a List<int>生成一个整数数组,并且可以直接存储数字.使用ArrayList,您最终会存储对盒装整数值的引用数组.
相关的实现细节是a的底层存储List<T>是T [].因此,对于一个List<int>值,将存储在int []中.整数存储在连续的内存块中,从垃圾收集堆中分配.
使它如此快速的原因不仅仅是整数没有盒装,而是int []在CPU缓存中运行得非常好.当您读取第一个元素时,您基本上可以免费获得下一个15,而无需读取慢速RAM或二级缓存.这对于盒装int来说效果不是很好,因为它太大而且额外的引用可能具有较差的缓存局部性.但是,垃圾收集器真的有助于通过压缩堆来消除成本.
ArrayList 是对存储在堆中的对象的引用的本地数组。
引用类型的通用列表是对存储在堆中的对象的引用的本地数组。
值类型的通用列表是这些值类型的本地数组。
有两个内存区域,大多数参考文献将其称为“堆栈”和“堆”。大多数使用这些术语的人不知道为什么。(“堆栈”可能是堆栈,但堆几乎肯定不是堆)。我更喜欢“这边”和“那边”这两个词。装箱后,值类型数据存储在“那边”。当存储在数组中(可能在通用列表中)时,值类型数据存储在“Over Here”。“在这里”更好。