1.包装器类型列表

你知道 Java 有 8 种原始类型,它们是不是类的类型。一方面,这很好——它们很简单,占用的空间也很小。另一方面,有时类正是我们所需要的。您将在下一课中找到确切原因。

那么可以做什么呢?

从 Java 的第五个版本开始,每个原始类型都获得了一个孪生类。每个这样的类都存储一个具有特定类型值的字段。这些类称为包装器类型,因为它们将原始值包装在类中。

这是这些类型的列表。你知道任何?

原始类型 包装类
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

基本类型的名称以小写字母开头,而包装类的名称以大写字母开头。一些类名也有点长:Integerinstead of intи Characterinstead of char

包装类的所有对象都是不可更改的(不可变的)。

该类的简化代码Integer如下所示:

代码 笔记
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}


变量

构造函数




方法返回值




静态方法Integerint变量创建一个新对象

2. 将 an 转换int为 anInteger

包装器类型被认为是它们原始兄弟姐妹的对应物:您可以轻松地创建一个对应于原始类型的包装器对象。

下面我们以int类型为例,分析原始类型是如何与对应的包装类型进行交互的。int从 an到 an的转换代码Integer如下所示:

要将 an 转换int为 an Integer,您需要编写以下代码:

Integer name = new Integer(value);

其中name是变量名Integervalue是包装后的int值。

例子:

代码 笔记
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

要将 an 转换Integer为 an int,您需要编写以下代码:

int name = variable.intValue();

其中name是变量的名称intvariable是对对象的引用Integer

例子:

代码 笔记
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

3. 自动装箱和拆箱

但即使是简单的类型操作Integer也不容易编写。

正如我们之前所说,Integer类型是不可改变的(immutable)。要创建Integer具有新int值的对象,您需要显式创建一个新Integer对象。也就是说,获取int存储在对象内部的值很容易Integer——只需调用该intValue()方法即可。

例子:

代码 描述
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
包裹5在一个Integer对象中从对象中
获取值 创建一个新对象(等于10)Integer
Integer

这是相当麻烦的代码,你不觉得吗?

Java 的创造者是这么认为的,所以他们教编译器如何自动执行这些操作。intan到 an的自动转换Integer称为自动装箱(自动将值放入盒子中),反向操作(将 an 转换Integer为 an int)称为拆箱

你的代码 编译器看到了什么
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

由于自动装箱和拆箱,您可以安全地将 an 分配intInteger变量,反之亦然。您可以编写任何复杂的表达式,而无需区分类型intInteger类型。

例子:

代码 编译器将生成什么
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4.比较包装器变量

自动装箱和拆箱是简单透明的过程。我们new Integer()根据需要使用语句,根据intValue()需要调用方法。

对程序员来说,一切都很好,很容易。请记住,如果您比较 anInteger和 an Integer,则比较基于参考而非值。

代码 控制台输出
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

a变量b不存储int值。它们存储对对象的引用。这意味着记住如何正确比较它们很重要:

错误的 正确的
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}