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

那么,有什么不同呢?


当前回答

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

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


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

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

其他回答

嗯,在Java中,int是一个原语,而Integer是一个对象。意思是,如果你创建了一个新的Integer:

Integer i = new Integer(6);

你可以在i上调用一些方法:

String s = i.toString();//sets s the string representation of i

而对于int类型:

int i = 6;

您不能在它上调用任何方法,因为它只是一个原语。所以:

String s = i.toString();//will not work!!!

会产生一个错误,因为int不是一个对象。

int是Java中为数不多的基本类型之一(还有char和其他一些基本类型)。我不是100%确定,但我认为Integer对象或多或少只是有一个int属性和一大堆方法与该属性进行交互(例如toString()方法)。因此Integer是处理int的一种奇特方式(就像String是处理一组字符的奇特方式一样)。

我知道Java不是C语言,但由于我从未用C语言编程,这是我能找到的最接近答案的方法。

整数对象javadoc

Integer Ojbect与int原语比较

int变量保存一个32位有符号整数值。Integer(大写I)保存对(类)类型Integer或null对象的引用。

Java自动在两者之间进行类型转换;当Integer对象作为int操作符的参数出现,或者被赋值给int变量,或者一个int值被赋值给Integer变量时,从Integer到int。这种类型转换称为装箱/解装箱。

如果一个引用null的Integer变量被显式或隐式地解盒,则抛出NullPointerException异常。

在c#中,int只是System的别名。Int32,系统的字符串。字符串,double for System。双等等……

我个人更喜欢int, string, double等,因为他们不需要使用系统;这是个愚蠢的理由,我知道……

01. 整数可以为空。但是int不能为null。

Integer value1 = null; //OK

int value2 = null      //Error

02. 只能将包装器类类型值传递给任何集合类。

(包装类-布尔,字符,字节,短,整数,长,浮动,双)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

但通常我们在集合类中添加原始值?02点正确吗?

List<Integer> element = new ArrayList<>();
element.add(5);

是的02是正确的,因为自动装箱。

自动装箱是java编译器进行的自动转换 原始类型与其对应的包装器类之间。

然后5转换为整型值自动装箱。

在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基本训练。