Java中Integer和int有什么区别?


248

例如,为什么可以这样做:

int n = 9;

但不是:

Integer n = 9;

您可以执行以下操作:

Integer.parseInt("1");

但不是:

int.parseInt("1");

35
整数是类,整数是原始类型
Anycorn 2011年

24
可以执行Integer n = 9;自动装箱操作(除非您使用的是Java的旧版本)
Alderath 2012年

Answers:


319

int是原始类型。类型的变量int存储要表示的整数的实际二进制值。int.parseInt("1")没有意义,因为int不是类,因此没有任何方法。

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

更具体地说,Integer是一个具有单个type字段的类int。此类用于需要int与其他任何对象一样对待的地方,例如在通用类型或需要可为空的情况下。

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

  • byteByte
  • shortShort
  • intInteger
  • longLong
  • booleanBoolean
  • charCharacter
  • floatFloat
  • doubleDouble

包装器类从Object类继承,而原始类则没有。因此,它可以用于带有对象引用或泛型的集合中。

从Java 5开始,我们具有自动装箱功能,并且原始类和包装类之间的转换是自动完成的。但是要当心,因为这可能会引起细微的错误和性能问题;明确表示转化永远不会受到伤害。


6
C#所有数据类型中都有“别名”并且int.Parse()确实有意义(即使确实没有)
Vahid Amiri

22
@ VSG24 ...但这是一个Java问题,这是Java答案。C#与这里完全无关。
Darkhogg

3
一个很好的例子是:编译错误:List <int>有效:List <Integer>
hagai

额外的知识总会受益
萨尔马·夏尔马

1
我喜欢学习新事物,尤其是当知识与当前主题相关时。谢谢瓦希德。
Paul Oliver

30

整数是一个类,整数是原始类型。

阅读以下链接:


1
我想指出,我认为这是一个完美的答案,其原因有两个:1-简洁准确,牢记受众/提问者2-提供更多细节的指导,而不是将所有内容都放在答案的文本中不是全部可以准确,简洁地回答问题(某些问题需要更多细节和细微差别才能准确和完整),但我认为所有答案都应尽量做到这一点既简单又直接。
DRich '16

11
呵呵,我认为实际上是相反的。如果您不知道什么是原始类型,则“ int是原始类型”不会告诉您任何信息。(如果这样做,您很可能已经知道int和Integer之间的区别)。将阅读器发送到两个标记为“链接1”和“链接2”的链接非常无济于事,特别是与仅引用相关部分相比。
史蒂夫·本内特

7

整数几乎只是原始类型int的包装。它允许您使用Integer类的所有功能使您的生活更轻松。

如果您不熟悉Java,则应该学习Java文档。例如,任何您想了解的有关Integer类的信息都会详细记录。

这直接来自Integer类的文档:

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


7
这有点错了。例如,与Integer类一样,它可以存储在容器中(与原始类型不同)。
奥利弗·查尔斯沃思

6

一个int变量保存一个32位带符号整数值。一个Integer(大写I)持有对(类)Integer类型的对象的引用,或对null的引用。

Java自动在两者之间进行转换。从Integer到int,只要Integer对象作为int运算符的参数出现或被分配给int变量,或将int值分配给Integer变量。这种转换称为装箱/拆箱。

如果将引用null的Integer变量显式或隐式取消装箱,则将引发NullPointerException。

(在上文中,术语“变量”是指局部变量,字段或参数)


5

Integer是指Java中的包装器类型,而int它是原始类型。Java中除原始数据类型之外的所有东西都像对象一样实现,这意味着Java是一种高质量的纯面向对象编程语言。如果需要,在Java中所有原始类型都可以作为包装器类型使用。使用原始类型可以带来一些性能上的好处,因此仅在必要时才使用包装器类型。

在下面的示例中。

Integer n = 9;

该常量9自动装箱到auto-boxing并且unboxing会自动从此java 5开始自动发生)Integer,因此您可以使用类似and的语句Integer n = new Integer(9)。这实际上是通过声明实现的Integer.valueOf(9).intValue();


3

int是原始类型,而不是对象。这意味着没有与之关联的方法。整数是具有方法(例如parseInt)的对象。

使用较新的java,可以进行自动装箱(和拆箱)功能。这意味着编译器将在需要的地方插入Integer.valueOf(int)或integer.intValue()。这意味着实际上有可能写

Integer n = 9;

解释为

Integer n = Integer.valueOf(9);

3

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


5
JDK5 +也只接受对象;只是自动装箱让编译器自动为您呼叫Integer.valueOf(i)Integer.intValue()为您服务。Collection<int>仍然无法正常工作。因此,这不是一个完全不同的故事,而是同一个故事,只是有一些速记。
yshavit 2011年

同意 抱歉,我的措辞可能没有反映出来。
科萨2011年

3

在Java中,int是原始数据类型,而Integer是Helper类,它用于将一种数据类型转换为另一种数据类型。

例如:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

原始数据类型在Helper类复杂的地方存储最快的可用内存,并存储在堆内存中。

参考来自“ David Gassner”的Java基础培训。


2

int是表示整数的原始类型。而是Integer一个包装的Object int。该Integer对象为您提供更多功能,例如转换为十六进制,字符串等。

您还可以将OOP概念与结合使用Integer。例如,您可以将Integer用于泛型(即)。Collection<Integer>


2

摘自Java:完整参考,第9版

Java使用原始类型(也称为简单类型),例如intdouble来保存语言支持的基本数据类型。为了性能起见,将原始类型而不是对象用于这些数量。对这些值使用对象会给最简单的计算增加不可接受的开销。因此,基本类型不是对象层次结构的一部分,并且它们不继承Object

尽管原始类型提供了性能上的好处,但有时您仍需要对象表示。例如,您不能通过引用method来传递基本类型。而且,Java实现的许多标准数据结构都对对象进行操作,这意味着 您不能使用这些(对象特定的)数据结构来存储基本类型。为了处理这些(和其他)情况,Java提供了类型包装器,它们是将对象中的原始类型封装起来的类。

包装器类与Java的自动装箱 功能直接相关。类型包装器是Double,Float,Long,Integer,Short,Byte,Character和Boolean。这些类提供了各种各样的方法,使您可以将基本类型完全集成到Java的对象层次结构中。


1

为了优化Java代码运行时,int 基本类型(S)已加入包括floatbool等等,但他们有没有一起去包装类,以便在需要时您可以转换和许多实用工具,来作为他们的成员一起将它们作为标准的Java对象功能(例如Integer.parseInt("1"))。


1

int是基本数据类型,而Integer在Java中是引用或包装类型(类)。

java 1.5介绍了自动装箱拆箱的概念之后,您可以同时初始化两者intInteger像这样。

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

为什么Integer.parseInt("1");但不是int.parseInt("1");

Integerjdk库中定义的类,并且parseInt()是属于Integer类的静态方法

因此,Integer.parseInt("1");在Java中是可能的。但int在Java中是原始类型(假设像关键字一样)。所以,你不能打电话parseInt()int

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.