我在阅读《关于软件的更多Joel》时,偶然看到Joel Spolsky说,有一种特殊类型的程序员知道Java/ c#(面向对象编程语言)中int和Integer的区别。
那么,有什么不同呢?
我在阅读《关于软件的更多Joel》时,偶然看到Joel Spolsky说,有一种特殊类型的程序员知道Java/ c#(面向对象编程语言)中int和Integer的区别。
那么,有什么不同呢?
当前回答
在java中,根据我的知识,如果你学习那么,当你写在一个;然后在java泛型中,它将编译像Integer a = new Integer()这样的代码。 因此,根据泛型不使用Integer,而是使用int。 所以这是有区别的。
其他回答
我将对上面给出的优秀答案进行补充,并讨论装箱和拆箱,以及如何将其应用于Java(尽管c#也有)。我将只使用Java术语,因为我对它更熟悉。
正如答案所提到的,int只是一个数字(称为未装箱类型),而Integer是一个对象(包含数字,因此是装箱类型)。在Java术语中,这意味着(除了不能在int上调用方法之外),您不能在集合(List, Map等)中存储int或其他非对象类型。为了存储它们,必须首先将它们装入相应的盒装类型中。
Java 5以后有了所谓的自动装箱和自动拆箱,允许装箱/拆箱在幕后完成。比较和对比:Java 5版本:
Deque<Integer> queue;
void add(int n) {
queue.add(n);
}
int remove() {
return queue.remove();
}
Java 1.4或更早版本(也没有泛型):
Deque queue;
void add(int n) {
queue.add(Integer.valueOf(n));
}
int remove() {
return ((Integer) queue.remove()).intValue();
}
必须注意的是,尽管Java 5版本很简洁,但两个版本生成的字节码是相同的。因此,尽管自动装箱和自动拆箱非常方便,因为您编写的代码更少,但这些操作确实发生在幕后,具有相同的运行时成本,因此您仍然必须知道它们的存在。
希望这能有所帮助!
在这两种语言(Java和c#)中,int是4字节有符号整数。
与Java不同,c#同时提供有符号整数值和无符号整数值。由于Java和c#是面向对象的,这些语言中的一些操作并不直接映射到运行时提供的指令,因此需要将其定义为某种类型的对象的一部分。
c#提供了System。Int32,它是一个值类型,使用属于堆上引用类型的内存的一部分。
java提供了java.lang. integer,它是对int操作的引用类型。Integer中的方法不能直接编译为运行时指令。因此,我们将一个int值框起来,将其转换为Integer的实例,并使用某些类型的实例的方法(如toString(), parseInt(), valueOf()等)。
在c#中,变量int是指System.Int32。内存中的任何4字节值都可以被解释为原始int,可以由System.Int32的实例操作。int是system。int32的别名。当使用int.Parse(), int.ToString()等与整数相关的方法时。整数被编译成整柜系统。Int32结构调用Int32. parse (), Int32. tostring()等方法。
还有一件事我在之前的回答中没有看到: 在Java中,原始包装类如Integer, Double, Float, Boolean…和String应该是不变的,所以当你传递这些类的实例时,被调用的方法不能以任何方式改变你的数据,在opositión中,大多数其他类的内部数据可以被它的公共方法改变。所以这个类只有getter方法,没有setter方法,除了构造函数。
在java程序中,字符串字面量存储在堆内存的单独部分中,只有一个字面量的实例,以节省重用这些实例的内存
“int”是原始数据类型,是Java包装类中的“Integer”。“Integer”可以用作需要对象的方法的参数,而“int”可以用作需要整数值的方法的参数,可用于算术表达式。
在Java中,'int'类型是一个原语,而'Integer'类型是一个对象。
在c#中,'int'类型与System相同。Int32,是一个值类型(即更像java 'int')。整数(就像任何其他值类型一样)可以被装箱(“包装”)到一个对象中。
对象和原语之间的区别在某种程度上超出了这个问题的范围,但总结一下:
对象为多态性提供了便利,通过引用传递(或者更准确地说,通过值传递引用),并从堆中分配。相反,原语是按值传递的不可变类型,通常从堆栈中分配。