包装类装箱和拆箱 - Java和C#中的int和Integer有什么区别?




java中integer和int区别 (18)

“ int”是原始数据类型,在Java的Wrapper类中是“ Integer”。 “整数”可以用作需要对象的方法的参数,而“整数”可以用作需要整数值的方法的参数,该整数可以用于算术表达式。

当我遇到 Joel Spolsky 时,我读的是《 关于软件的更多Joel》, 这是关于某种特定类型的程序员的一些知识,他们知道Java / C#(面向对象编程语言)中的 intInteger 之间的区别。

那么区别是什么呢?


Java和C#中的int和Integer是用于表示不同事物的两个不同术语。 它是可以分配给可以精确存储的变量的原始数据类型之一。 一次声明其类型的一个值。

例如:

int number = 7;

其中 int 是分配给变量编号的数据类型,该变量编号保留值7。 因此,一个 int 只是一个原始而不是一个对象。

Integer 是具有静态方法的原始数据类型的包装器类。 可以将其用作需要对象的方法的参数,而将int用作需要整数值的方法的参数,可以将其用于算术表达式。

例如:

Integer number = new Integer(5);

int用于声明原始变量

e.g. int i=10;

Integer用于创建Integer类的引用变量

Integer a = new Integer();

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

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

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


关于Java 1.5和 autoboxing ,比较Integer对象时有一个重要的“怪癖”起作用。

在Java中,值-128到127的Integer对象是不可变的(也就是说,对于一个特定的整数值(例如23),通过程序实例化的所有Integer对象(值23)都指向 完全相同的 对象)。

示例,返回true:

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); //  true

虽然返回false:

Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //  false

==通过引用进行比较(变量是否指向同一对象)。

根据您使用的JVM,此结果可能会有所不同。 Java 1.5的规范自动装箱要求整数(-128到127)始终装箱到同一包装对象。

一个办法? =)比较Integer对象时,应始终使用Integer.equals()方法。

System.out.println(i1.equals(i2)); //  true

java.net 更多信息 bexhuff.com 示例


在C#中,int只是 System.Int32 别名 System.String 字符串, System.Double double等等。

我个人更喜欢int,string,double等,因为它们不需要 using System; 声明:)一个愚蠢的原因,我知道...


在Java中, int 类型是原始数据类型,而 Integer 类型是对象。

在C#中, int 类型也是与 System.Int32 相同的数据类型。 可以将 integer (就像其他任何值类型一样)装箱(“包装”)到对象中。


在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基础培训。


在两种语言(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.Any 。内存中的任何4字节值都可以解释为原始int,可以由System.Int32的实例进行操作。因此int是System.Int32的别名。相关方法,例如 int.Parse()int.ToString()int.ToString() 编译到FCL System.Int32 结构中,调用相应的方法,例如 Int32.Parse()Int32.ToString()


好吧,在Java中,一个int是一个原语,而一个Integer是一个Object。 意思是,如果您创建了一个新的整数:

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可能是使用一组char的一种理想方式)一样。

我知道Java不是C,但是由于我从未用C编程,因此这是我能找到的最接近的答案。 希望这可以帮助!

整数对象javadoc

整数对象与整数基本类型的比较


您曾经编程过吗(int)是可以为变量设置的原始类型之一(就像char,float等)。

但是Integer是包装器类,您可以使用它对int变量执行某些功能(例如,将其转换为字符串或反之亦然,...),但请注意,包装器类中的方法是静态的,因此您可以使用它们任何时候都无需创建Integer类的实例。 作为回顾:

int x;
Integer y; 

x和y都是int类型的变量,但是y由Integer类包装并且有几种使用的方法,但是我想您需要调用Integer包装器类的某些函数就可以轻松实现。

Integer.toString(x);

但请注意,x和y都是corect,但是如果要将它们仅用作基本类型,请使用简单形式(用于定义x)。


我在以前的答案中没有看到的另一件事:在Java中,原始包装器类(例如Integer,Double,Float,Boolean ...和String)应该是不变的,因此当您传递这些类的实例时,调用的与大多数其他类相反,该方法无法以任何方式更改您的数据,这些内部数据可以通过其公共方法来更改。 因此,除了构造函数之外,此类仅具有“ getter”方法,而没有“ setter”方法。

在Java程序中,字符串文字存储在堆内存的单独部分中,仅是文字的一个实例,以节省重用这些实例的内存


我将添加到上面给出的出色答案中,并讨论装箱和拆箱,以及它如何适用于Java(尽管C#也是如此)。 我将仅使用Java术语,因为我对此更为满意。

如答案所述, int 只是一个数字(称为未 装箱的 类型),而 Integer 是一个对象(包含数字,因此是一个 装箱的 类型)。 用Java术语来说,这意味着(除了不能在 int 上调用方法之外),您不能在集合( ListMap 等)中存储 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中,如果您是学习者,那么在编写int时就可以了; 然后在Java泛型中它将编译类似 Integer a = new Integer() 。 因此,按照泛型,不使用 Integer 但使用 Integer 。 所以那里是如此不同。


int 是在库函数c#中预定义的,但是在Java中我们可以创建 Integer 对象


01.整数可以为null。 但是int不能为null。

Integer value1 = null; //OK

int value2 = null      //Error

02.仅可以将Wrapper类的类型值传递给任何集合类。

(包装类-布尔,字符,字节,短整数,整数,长整数,浮点数,双精度)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

但是通常我们将原始值添加到集合类中吗? 点02正确吗?

List<Integer> element = new ArrayList<>();
element.add(5);

是的02是正确的,因为 autoboxing.

自动装箱是Java编译器在原始类型及其对应的包装器类之间进行的自动转换。

然后5通过自动装箱将其转换为整数值。


int 是原始数据类型。 整数 是包装器类。 它可以将int数据存储为对象。


在Java中, “ int”类型是原始类型,而“ Integer”类型是对象。

在C#中, “ int”类型与 System.Int32 相同,并且是 一个值类型 (即更类似于Java“ int”)。 可以将整数(就像其他任何值类型一样) boxed (“包装”)到对象中。

对象和基元之间的差异在一定程度上超出了此问题的范围,但可以总结一下:

对象 为多态提供了便利,通过引用传递(或更准确地说,通过值传递引用),并从 heap 分配对象。 相反, 基元 是不可变的类型,它们按值传递,并且通常是从 stack 分配的。





int