Int32类型的ArrayList如何可以大于Int32类型列表
本文关键字:Int32 类型 大于 列表 ArrayList 何可 | 更新日期: 2023-09-27 18:28:26
我有一个赋值,它包括在创建泛型类型ArrayList
和List
的实例时解释以下结果。
ArrayList de Int32 = 280 ns ; 1.603.604 bytes
List<Int32> = 59 ns ; 408.224 bytes
ArrayList de String = 77 ns ; 408.224 bytes
List<String> = 74 ns ; 408.224 bytes
我花了相当多的时间试图弄清楚这一点,又花了大量的时间试图在互联网上找到一些东西,但一无所获。
提前感谢:)
我认为要求一个赋值的解决方案是不可以的。另一方面,我认为这项任务很愚蠢,因为你要么在某个地方读到了关于区别以及.NET中泛型是如何工作的,要么没有读到,所以我想我无论如何都会回答。
ArrayList不是通用的,这意味着它包含一个对象数组。每个int都应该被装箱在一个对象中,该对象向实际的4字节数据添加了大约12个字节(我认为对象的开销是12个字节,但我可能会偏离几个字节)。这是在对象中包装int的内存成本。还有CPU的时间成本做包装和展开。另一方面,List或任何值类型都是专门化的。这意味着CLR为int生成一个特殊版本的列表。内部数组是int数组,而不是对象数组,因此不会丢失数据的额外内存。由于不执行装箱和取消装箱,因此时间也有所改善。请注意,额外的对象会给GC带来压力,GC必须在某个时刻收集它们。
对于字符串来说没有惩罚,因为字符串是引用类型,所以它们的工作方式基本上与对象相同。它们已经包含了12字节的开销。在铸造时检查类型可能会有一些小的CPU开销,但不执行昂贵的装箱。这就是为什么泛型列表和ArrayList 在性能和内存方面没有显著差异的原因
同样值得注意的是,这种方法并不是泛型在所有语言中的工作方式。例如,Java是完全不同的,所以如果你使用一些非.NET技术,一定要检查你的知识是否适用。