Nee*_*aks 29
C#具有统一的类型系统.所有C#类型(包括int和double等基本类型)都从单个根object类型继承.与类对象不同,这些基本类型是值类型.它们不是单独堆分配的,而是按值传递的.
当C#值类型(例如基本int或用户定义的结构)放置在参数集合中时,它存储在没有指针的密集数组中.这是可能的,因为C#为所需的每个不同参数"大小"进行自定义参数实例化.这意味着当您实例化C#时List<int>,底层数组列表存储密集的int数组.
资料来源:http://www.pin5i.com/showtopic-24376.html
Java也有几种基本类型(int,long,double,byte等) - 然而,它们的特殊之处在于它们不是面向对象的,并且它们不能使用语言本身来定义.它们是值类型,而不是堆分配,并按值传递.
来源:C#和Java的比较 - 统一类型系统(维基百科)
同时,Java还具有面向对象的原始"包装"类型(Integer,Long,Double,Byte等),通常称为boxed类型.这些是堆分配的对象,它们通过引用传递,并且与上面提到的基元类型并行存在.
在Java的更新版本中,基本类型在必要时自动装入对象类型.这减轻了管理它们的大部分负担,但它也可能导致细微的错误(另请参阅自动装箱).
与C#相反,在Java中,内置的JDK Collections框架始终管理对象指针的集合.为了使它们以向后兼容的方式进行参数化,Java执行一种称为类型擦除的技术,其中(在运行时)所有内容都被视为容器内的对象(参数化类型检查在编译时执行).
这意味着你不能制作Java List<int>,你只能制作List<Integer>.并且,上面的列表实际上存储了一个指向盒装Integer对象的指针数组,这个指针的大小是C#版本的两倍,性能也大大降低.对于大多数用例,这种尺寸和性能的差异是无关紧要的.
在大小和性能相关的用例中,有两种选择:
int[].本机类型的数组被打包在内存中,因此它们消耗的内存更少,性能更高.Mic*_*l B 12
这实际上并不适用于C#,并非所有类型都来自对象,就像99.9%的对象一样.存在一些无法变成对象的非常奇怪的类型.唯一官方支持的是指针.还有3个不受支持的,比如TypedReference,RuntimeArgumentHandle和第三个名字让我失望的人.这三种类型与C++/C中的可变长度方法互操作一起使用.我不会太担心他们.