我在阅读《关于软件的更多Joel》时,偶然看到Joel Spolsky说,有一种特殊类型的程序员知道Java/ c#(面向对象编程语言)中int和Integer的区别。
那么,有什么不同呢?
我在阅读《关于软件的更多Joel》时,偶然看到Joel Spolsky说,有一种特殊类型的程序员知道Java/ c#(面向对象编程语言)中int和Integer的区别。
那么,有什么不同呢?
当前回答
在java中,根据我的知识,如果你学习那么,当你写在一个;然后在java泛型中,它将编译像Integer a = new Integer()这样的代码。 因此,根据泛型不使用Integer,而是使用int。 所以这是有区别的。
其他回答
Int是基本数据类型。 Integer是一个包装器类。它可以将int型数据存储为对象。
我只在这里发布,因为其他一些帖子在与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 1.5和自动装箱,在比较Integer对象时有一个重要的“怪癖”。
在Java中,值为-128到127的Integer对象是不可变的(也就是说,对于一个特定的整数值,比如23,通过程序实例化的所有值为23的Integer对象都指向完全相同的对象)。
例如,返回true:
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); // true
而这返回false:
Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); // false
==通过引用进行比较(变量是否指向同一个对象)。
根据所使用的JVM的不同,这个结果可能不同,也可能没有不同。Java 1.5的规范自动装箱要求整数(-128到127)始终装入同一个包装器对象。
一个解决方案吗?当比较Integer对象时,应该总是使用Integer.equals()方法。
System.out.println(i1.equals(i2)); // true
更多信息请访问bexhuff.com
在Java等平台中,int是基本类型,而Integer是一个包含整数字段的对象。重要的区别是,原语总是通过值传递,并且通过定义是不可变的。
任何涉及基本变量的操作总是返回一个新值。另一方面,对象是通过引用传递的。有人可能会说指向对象的点(又名引用)也通过值传递,但内容不是。
在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基本训练。