在Java和C#中,int和Integer有什么区别?

269

我在阅读更多Joel关于软件的内容时,看到Joel Spolsky提到了一种特定类型的程序员需要知道Java/C#(面向对象编程语言)中intInteger之间的区别。

那么,这两者有什么区别呢?


5
C#没有整数类型。 - Judah Gabriel Himango
26个回答

8

这个问题已经在Java中得到了回答,下面是C#的答案:

"Integer"不是C#中的有效类型名称,“int”只是System.Int32的别名。此外,与Java(或C ++)不同,在C#中没有特殊的原始类型,C#中每种类型的实例(包括int)都是一个对象。以下是一些示范代码:

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}

2
要明确的是,在C#中,int和System.Int32都不是对象。它们是值类型,并且在CLR中与对象有很大的区别。 - Peter Meyer
4
实际上,在C#中,Int32是一个对象。它是一个值类型结构体对象,继承自System.Object类。与Java中的"int"相比,并没有特别不同对待其他值对象。 - Wedge

8
在像Java这样的平台中,int是原始类型,而Integer是一个包含整数字段的对象。重要的区别在于原始类型总是按值传递,并且根据定义是不可变的。任何涉及原始变量的操作都会返回一个新值。另一方面,对象是按引用传递的。有人可能会认为对象指向(即引用)也是按值传递的,但其内容并非如此。

@peter Mortense,(int a; Integer a;) 这两者对程序有什么影响呢?也就是说,在执行过程中它们有何不同之处? - Anuj Masand

8

除了之前的回答中没有看到的一点是:在Java中,原始包装类如Integer、Double、Float、Boolean和String被认为是不变的,因此当您传递这些类的实例时,被调用的方法不能以任何方式更改您的数据,与大多数其他类相反,其内部数据可以通过其公共方法进行更改。因此,这些类只有“getter”方法,没有“setter”,除了构造函数。

在Java程序中,字符串字面值存储在堆内存的单独部分中,每个字面值只有一个实例,以节省内存并重用这些实例。


7

Java:

int, double, long, byte, float, double, short, boolean, and char are primitive data types. They hold basic data types supported by the language. The primitive types are not part of the object hierarchy and do not inherit Object. They cannot be passed by reference to a method.

Double, Float, Long, Integer, Short, Byte, Character, and Boolean are type Wrappers, packaged in java.lang. All the numeric type wrappers define constructors that allow an object to be constructed from a given value or a string representation of that value. However, using objects can add overhead to even the simplest of calculations.

Starting with JDK 5, Java includes two helpful features: autoboxing and autounboxing. Autoboxing/unboxing simplifies and streamlines code that must convert primitive types into objects and vice versa.

Examples of constructors:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

装箱/拆箱的示例:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

自动装箱/拆箱的示例:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

注:参考了Herbert Schildt的书。


4
在Java和C#中,“int”和“Integer”是表示不同事物的两个术语。它是可以赋值给变量的原始数据类型之一,该变量每次只能存储其声明类型的一个值。
例如:
int number = 7;

在变量number中存储值为7的数据时,使用了int数据类型。因此,int只是一种原始类型而不是对象。

而Integer则是一个包装类,用于封装原始数据类型,并具有静态方法。它可以作为需要对象参数的方法的参数,而int可以作为需要整数值的方法的参数,可用于算术表达式。

例如:

Integer number = new Integer(5);

4

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

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

如果对指向null的Integer变量进行拆箱,无论是显式还是隐式,都会抛出NullPointerException异常。


4
在Java中,int类型是一种原始数据类型,而Integer类型是一个对象。
在C#中,int类型也是一种数据类型,与System.Int32相同。一个integer(就像任何其他值类型)可以被装箱(“包装”)成一个对象。

4
在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()等)时,Integer被编译成FCLSystem.Int32结构,调用相应的方法,如Int32.Parse()Int32.ToString()

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》。


2

"int"是Java中的原始数据类型,而"Integer"则是包装类。当需要一个对象作为参数时,可以使用"Integer",而当需要一个整数值作为参数时,则可以使用"int",这个整数值可以用于算术表达式。


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