Java中Integer和int的区别是什么?

305
例如,你为什么可以这样做:
int n = 9;

但不是:

Integer n = 9;

你可以这样做:

Integer.parseInt("1");

但不包括:

int.parseInt("1");

47
整数是一个类,int是一种原始类型。 - Anycorn
38
你可以使用自动装箱(除非你使用的是非常旧的Java版本),因此可以执行Integer n = 9; - Alderath
3
就像从市政喷泉(int)获得普通水与从附近商店购买漂亮包装的同一种水。包装的水除了成本开销之外还有一些好处。以松散的方式来说,它们类似。 - MinhajulAnwar
11个回答

402

int 是一个基本类型。类型为 int 的变量存储所要表示的整数的实际二进制值。因为 int 不是类,所以 int.parseInt("1") 没有意义,它没有任何方法。

Integer 是 Java 语言中的一个类,与其他类没有区别。类型为 Integer 的变量存储对 Integer 对象的引用,就像其他引用(对象)类型一样。 Integer.parseInt("1") 是对类 Integer 中的静态方法 parseInt 的调用 (请注意,此方法实际上返回的是一个 int 而不是 Integer)。

更具体地说,Integer 是一个具有单个类型为 int 的字段的类。当你需要将 int 表示为其他对象时,例如在泛型类型或需要可空性的情况下使用该类。

请注意,Java 中的每个基本类型都有一个等效的包装类:

  • byte 对应 Byte
  • short 对应 Short
  • int 对应 Integer
  • long 对应 Long
  • boolean 对应 Boolean
  • char 对应 Character
  • float 对应 Float
  • double 对应 Double

包装类继承自 Object 类,而基本类型不是。因此,它可以与具有 Object 引用或 Generics 的集合一起使用。

自 Java 5 起,我们拥有自动装箱(autoboxing)功能,原始类型和包装类之间的转换会自动完成。但要注意,这可能会引入微妙的错误和性能问题;显式地进行类型转换永远不会有错。

6
好的例子可以是:编译错误:List<int>正确的写法:List<Integer> - hagai
额外的知识总是有益的。 - sumit sharma
1
我喜欢学习新事物,尤其是与当前主题相关的知识。谢谢Vahid。 - Paul Oliver
我更喜欢明确的语句,因为保持这种做法本身就是一个杀虫剂。 - MinhajulAnwar
为什么他们不从Java的新版本中删除原始类型? - Mohammad_Hosein
1
@Mohammad_Hosein 性能和兼容性 - Darkhogg

10

整数 Integer 类型基本上只是原始类型 int 的一个包装器。它允许您使用 Integer 类的所有函数,使您的生活变得更加轻松。

如果您是 Java 新手,您应该学会欣赏 Java 文档。例如,您想要了解有关 Integer 类 的任何信息都可以详细阅读文档。

这是来自 Integer 类文档的直接摘录:

Integer 类将原始类型 int 的值包装在对象中。类型为 Integer 的对象包含一个类型为 int 的字段。


7
有点偏离重点。例如,由于“Integer”是一个类,它可以被存储在容器中(而不像原始类型)。 - Oliver Charlesworth

6
一个 int 变量可以保存一个 32 位有符号整数值。而 Integer (大写 I)则保存对 Integer 类型对象的引用,或者为 null。
Java 会自动地在 Integer 对象作为 int 操作符的参数或被赋给 int 变量时,在两者之间进行类型转换;或者当 int 值被赋给 Integer 变量时。这种转换被称为装箱(boxing)/拆箱(unboxing)。
如果一个指向 null 的 Integer 变量被拆箱,无论是显式还是隐式地,都会抛出 NullPointerException 异常。
(在上面的文本中,“变量”一词指局部变量、字段或参数)。

5

Integer指的是Java中的包装类型,而int是一种原始类型。在Java中,除了原始数据类型外,所有其他内容都被实现为对象,这意味着Java是一种高度合格的纯面向对象的编程语言。如果需要,Java中也提供了所有原始类型的包装类型。使用原始类型可以获得一些性能优势,因此只有在必要时才应该使用包装类型。

例如,在您的示例中。

Integer n = 9;

常量9自动装箱(自动装箱和拆箱从java 5开始自动发生)为Integer,因此您可以使用该语句以及Integer n = new Integer(9)。这实际上是通过语句Integer.valueOf(9).intValue();来实现的。


4

Integer是一个包装类/对象,而int是原始类型。当您想要在集合中存储int值时,这种差异起到了巨大的作用,因为它们只接受对象作为值(直到jdk1.4为止)。从JDK5开始,由于自动装箱,情况完全不同。


5
JDK5+只接受对象,但自动装箱功能让编译器可以自动调用Integer.valueOf(i)Integer.intValue()。然而,Collection<int>仍然无法工作。因此这并不是完全不同的情况,只是使用了一些简写方式。 - yshavit
同意。抱歉,我的措辞可能没有反映出来。 - kosa

4
这是从Java核心技术卷I中摘录的。
Java使用原始类型(也称为简单类型)来保存语言支持的基本数据类型,例如int或double。出于性能考虑,这些量使用原始类型而不是对象。即使是最简单的计算,使用对象也会增加无法接受的开销。因此,原始类型不是对象层次结构的一部分,它们不继承Object。
尽管原始类型提供了性能优势,但有时需要对象表示。例如,你不能将原始类型按引用传递给方法。此外,许多由Java实现的标准数据结构操作对象,这意味着你不能使用这些(特定于对象)数据结构来存储原始类型。为了处理这些(和其他)情况,Java提供了类型包装器,这些类将原始类型封装在对象中。
包装类与Java的自动装箱功能直接相关。类型包装器是Double、Float、Long、Integer、Short、Byte、Character和Boolean。这些类提供了广泛的方法,允许你完全将原始类型集成到Java的对象层次结构中。

3
在Java中,int是一种原始数据类型,而Integer是一个辅助类,它用于将一种数据类型转换为另一种数据类型。
例如:
         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

基本数据类型存储在可用的最快速度内存中,而 Helper 类是复杂的并存储在堆内存中。

引用自 "David Gassner" 的 Java Essential Training。


3

int是一种基本类型,而不是对象。这意味着它没有与其相关的方法。Integer是一个带有方法的对象(如parseInt)。

在较新的Java中,有自动装箱(和拆箱)的功能。这意味着编译器会在需要时插入Integer.valueOf(int)或integer.intValue()。这意味着实际上可以编写以下代码:

Integer n = 9;

这被解释为

Integer n = Integer.valueOf(9);

2

int是一种原始类型,表示整数。而Integer是一个包装了int的对象。使用Integer对象可以获得更多的功能,例如转换为十六进制、字符串等。

您还可以使用面向对象编程(OOP)概念来处理Integer。例如,您可以将Integer用于泛型(即Collection<Integer>)。


2

int是Java中的一种原始数据类型,而Integer是引用类型或包装器类型(类)。

在Java 1.5之后,引入了自动装箱和拆箱的概念,您可以像这样初始化intInteger

int a= 9
Integer a = 9 // both valid After Java 1.5.

为什么使用 Integer.parseInt("1"); 而不是 int.parseInt("1"); ?? Integer 是在 jdk 库中定义的一个类,而 parseInt() 是属于 Integer 类的一个静态方法。
所以,在Java中可以使用 Integer.parseInt("1"); ,但是 int 是一种基本类型(类似于关键字),你不能使用 int 来调用 parseInt()

这是简单且更新的答案。 - Nandan A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接