我在阅读更多Joel关于软件的内容时,看到Joel Spolsky提到了一种特定类型的程序员需要知道Java/C#(面向对象编程语言)中int
和Integer
之间的区别。
那么,这两者有什么区别呢?
我在阅读更多Joel关于软件的内容时,看到Joel Spolsky提到了一种特定类型的程序员需要知道Java/C#(面向对象编程语言)中int
和Integer
之间的区别。
那么,这两者有什么区别呢?
这个问题已经在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;
}
int
是原始类型,而Integer
是一个包含整数字段的对象。重要的区别在于原始类型总是按值传递,并且根据定义是不可变的。任何涉及原始变量的操作都会返回一个新值。另一方面,对象是按引用传递的。有人可能会认为对象指向(即引用)也是按值传递的,但其内容并非如此。除了之前的回答中没有看到的一点是:在Java中,原始包装类如Integer、Double、Float、Boolean和String被认为是不变的,因此当您传递这些类的实例时,被调用的方法不能以任何方式更改您的数据,与大多数其他类相反,其内部数据可以通过其公共方法进行更改。因此,这些类只有“getter”方法,没有“setter”,除了构造函数。
在Java程序中,字符串字面值存储在堆内存的单独部分中,每个字面值只有一个实例,以节省内存并重用这些实例。
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的书。
int number = 7;
在变量number中存储值为7的数据时,使用了int数据类型。因此,int只是一种原始类型而不是对象。
而Integer则是一个包装类,用于封装原始数据类型,并具有静态方法。它可以作为需要对象参数的方法的参数,而int可以作为需要整数值的方法的参数,可用于算术表达式。
例如:
Integer number = new Integer(5);
一个int变量保存32位有符号整数值。Integer(大写I)保存对类类型Integer的对象的引用,或者为null。
Java会自动在两者之间进行转换:当Integer对象作为int运算符的参数出现,或者被分配给int变量时,或者int值被分配给Integer变量时,从Integer到int进行转换。这种转换称为装箱/拆箱。
如果对指向null的Integer变量进行拆箱,无论是显式还是隐式,都会抛出NullPointerException异常。
int
类型是一种原始数据类型,而Integer
类型是一个对象。int
类型也是一种数据类型,与System.Int32
相同。一个integer
(就像任何其他值类型)可以被装箱(“包装”)成一个对象。int
都是4字节有符号整数。System.Int32
,它是一个值类型,使用属于堆上引用类型的一部分内存。java.lang.Integer
,它是在int
上操作的引用类型。在Integer
中的方法不能直接编译为运行时指令。因此,我们将一个int值装箱以将其转换为Integer实例,并使用那些期望某种类型实例(如toString()
、parseInt()
、valueOf()
等)的方法。int
指的是System.Int32.Any
中的4字节值,该值可以被解释为一个原始的int,可以通过System.Int32
的实例来操纵。因此,int是System.Int32
的别名。在使用与整数相关的方法(如int.Parse()
、int.ToString()
等)时,Integer被编译成FCLSystem.Int32
结构,调用相应的方法,如Int32.Parse()
、Int32.ToString()
。double doubleValue = 156.5d;
Double doubleObject = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();
原始数据类型存储在可用速度最快的内存中,而Helper类是复杂的并且存储在堆内存中。
引用自《David Gassner Java Essential Training》。
"int"是Java中的原始数据类型,而"Integer"则是包装类。当需要一个对象作为参数时,可以使用"Integer",而当需要一个整数值作为参数时,则可以使用"int",这个整数值可以用于算术表达式。