我在阅读《关于软件的更多Joel》时,偶然看到Joel Spolsky说,有一种特殊类型的程序员知道Java/ c#(面向对象编程语言)中int和Integer的区别。

那么,有什么不同呢?


当前回答

我只在这里发布,因为其他一些帖子在与c#相关方面略有不准确。

正确:int是System.Int32的别名。 错误:float不是System的别名。浮动,但为了系统。单

基本上,int是c#编程语言中保留的关键字,是System的别名。Int32值类型。

float和float是不一样的,因为float的正确系统类型是system . single。有一些这样的类型,其保留关键字似乎与类型名称不直接匹配。

在c#中,“int”和“System”没有区别。Int32 ",或任何其他对或关键字/系统类型,定义枚举时除外。通过枚举,您可以指定要使用的存储大小,在这种情况下,您只能使用保留关键字,而不能使用系统运行时类型名称。

int中的值是存储在堆栈中,还是存储在内存中,还是作为引用的堆对象,这取决于上下文以及如何使用它。

方法中的声明:

int i;

定义一个System类型的变量i。Int32,位于寄存器或堆栈中,这取决于优化。一个类型(结构或类)中的相同声明定义了一个成员字段。方法参数列表中的相同声明定义了一个参数,具有与局部变量相同的存储选项。(注意,如果你开始将迭代器方法混合在一起,这段话是无效的,它们完全是不同的野兽)

要获得一个堆对象,你可以使用装箱:

object o = i;

这将在堆上创建I的内容的盒装副本。在IL中,您可以直接访问堆对象上的方法,但在c#中,您需要将其转换回int类型,这将创建另一个副本。因此,在c#中不容易更改堆上的对象,除非创建一个新的int值的新盒装副本。(啊,这段话读起来可不那么容易。)

其他回答

在Java中,'int'类型是一个原语,而'Integer'类型是一个对象。

在c#中,'int'类型与System相同。Int32,是一个值类型(即更像java 'int')。整数(就像任何其他值类型一样)可以被装箱(“包装”)到一个对象中。


对象和原语之间的区别在某种程度上超出了这个问题的范围,但总结一下:

对象为多态性提供了便利,通过引用传递(或者更准确地说,通过值传递引用),并从堆中分配。相反,原语是按值传递的不可变类型,通常从堆栈中分配。

在Java中,int是一个基本数据类型,而Integer是一个Helper类,它用于将一种数据类型转换为另一种数据类型。

例如:

double doubleValue = 156.5d;
Double doubleObject  = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();

基本数据类型存储最快的可用内存,而Helper类是复杂的,存储在heep内存中。

参考“David Gassner”Java基本训练。

Int用于声明原始变量

e.g. int i=10;

Integer用于创建类Integer的引用变量

Integer a = new Integer();

在java中,根据我的知识,如果你学习那么,当你写在一个;然后在java泛型中,它将编译像Integer a = new Integer()这样的代码。 因此,根据泛型不使用Integer,而是使用int。 所以这是有区别的。

在Java中,int类型是基本数据类型,而Integer类型是对象。

在c#中,int类型也是一种数据类型,与System.Int32相同。整数(就像任何其他值类型一样)可以被装箱(“包装”)到一个对象中。