9.6 Java和C#中的int和Integer有什么区别? | Java Debug 笔记

199 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问: Java和C#中的int和Integer有什么区别?

在我读《 More Joel on Software》的时候,Joel Spolsky在文中说了一种特定类型的程序员,他们了解Java / C#(面向对象编程语言)中的int和Integer之间的区别。

所以,区别是什么?

回答1:

我将为上面给出的出色答案锦上添花,并讨论装箱和拆箱,以及如何将其应用于Java(尽管C#也是如此)。 我将仅使用Java术语,因为我更喜欢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版本简短,但是两个版本都生成相同的字节码。 因此,尽管自动装箱和自动拆箱非常方便,以至于您只需编写较少的代码,但这些操作确实在幕后发生,并且运行时成本相同,因此您仍然必须意识到它们的存在。