Java和C#中的int和Integer有什么区别?
当我遇到Joel Spolsky在谈论某种类型的程序员知道int
/ int
和Integer
在Java / C#(面向对象编程语言)之间的区别时,我正在阅读更多Joel on Software。
那么区别是什么呢?
在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
整数Ojbect与int原始比较
我将添加上面给出的优秀答案,并谈论装箱和拆箱,以及这如何适用于Java(尽管C#也有)。 我将只使用Java术语,因为我对此更感兴趣。
正如所提到的答案, int
只是一个数字(称为unboxed类型),而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版本中简洁,但两个版本都会生成相同的字节码。 因此,尽管自动装箱和自动拆箱非常方便,因为您编写的代码较少,但这些操作确实发生在幕后,运行成本相同,因此您仍然需要知道它们的存在。
希望这可以帮助!
链接地址: http://www.djcxy.com/p/21043.html上一篇: What is the difference between an int and an Integer in Java and C#?