在Java创建包装类实例的不同方法
包装类 其对象包装或包含原始数据类型的类。当我们为包装类创建一个对象时,它包含一个字段,在这个字段中,我们可以存储原始数据类型。换句话说,我们可以将原始值包装到包装类对象中。
方法:
我们可以使用两种方式来构造 Wrapper Classes 的实例
- 使用包装类的构造函数
- 使用 Wrapper 类提供的 valueOf() 方法
- 使用自动装箱的概念
让我们分别详细讨论这两种方式
方法一:使用包装类的构造函数
句法:
ClassName object = new ClassName(argument);
插图:
Integer number = new Integer(5);
方法二:使用 Wrapper 类提供的 valueOf() 方法
句法:
ClassName object = ClassName.valueOf(argument);
插图:
Integer number = Integer.valueOf(5);
现在问题来了,这两种方法在创建 Wrapper 类的实例时有什么区别,哪种方法更适合构造实例。让我们实现这两种方法以在它们之间公平竞争。
执行:
例子
Java
// Importing input output classes
import java.io.*;
// Main class
class GFG {
// Main driver method
public static void main (String[] args) {
// Creating and initializing two integer numbers
// Value is passed as an argument to which it is initialized
// Custom entries
// Number 1 where N = 5
Integer num1 = new Integer(5);
// Number 2 where N = 5
Integer num2 = new Integer(5);
// Creating objects of Integer class
// using valueOf() method
// Again, creating and initializing two integer numbers
// Value is passed as an argument to which it is initialized
Integer num3 = Integer.valueOf(5);
Integer num4 = Integer.valueOf(5);
// Now by far, all the objects contain the same value
// N = 5
// Boolean will return true if numbers are equal
// else eturning false
// Comparing two numbers
boolean value1 = (num1 == num2);
boolean value2 = (num3 == num4);
// Print and display the bool results
System.out.println(value1);
System.out.println(value2);
}
}
Java
// Importing input output classes
import java.io.*;
// Main class
class GFG {
// Main driver method
public static void main (String[] args) {
// Creating Instances using AutoBoxing
Integer num1 = 5;
Integer num2 = 5;
boolean bool = (num1 == num2);
System.out.println(bool);
}
}
输出:
false
true
输出说明:
请注意,类的实例指向在堆中分配的内存位置,并且它们本身不保存该值。当我们在包装类的构造函数的帮助下创建对象时,每次在堆中分配新的内存并且对象指向不同的内存位置。因此,在上面的例子中,在这种情况下,num1 和 num2 都指向不同的内存位置,因此在比较时,它们返回 false。
请注意 valueOf() 方法的情况并非如此,因为 valueOf() 方法检查是否有任何内存分配给堆中该类的相同值。如果找到该值,则它将先前分配给新实例的内存位置提供给新实例,并且两者都开始指向堆中的相同内存位置。因此,在比较时,它返回 true。
由于包装类对象的值与 String 一样是不可变的,因此一旦分配就无法更改,因此它不会影响指向同一内存位置的实例数量。因此,在上面的示例中,内存分配给值 5 并且 num3 指向该内存位置,但是当我们创建另一个具有相同值的实例 num4 时,它也开始指向与 num3 指向的相同内存位置.
目前,不推荐使用构造函数创建实例的方法,因此最好使用 valueOf() 方法。因此,让我们继续讨论自动装箱的新概念。
方法三:使用自动装箱的概念
AutoBoxing 是为了减少我们每次创建实例时编写 valueOf() 方法的工作量,实现了 AutoBoxing。将基本类型自动转换为其相应包装器类的对象称为自动装箱。
到目前为止,我们一直在使用valueOf()方法创建包装类,但是当我们可以使用 AutoBoxing 时似乎很长。在 AutoBoxing 中,我们的工作由编译器完成,即后台的Java编译器将执行 valueOf() 操作并创建它的实例。
使用自动装箱创建的实例在后台遵循 valueOf() 的过程,因此在这种情况下,具有相同值的多个实例指向相同的内存位置。
说明:在上面的例子中,它也可以写成Integer.valueOf(15) ) 并将它的引用放在对象中(即一个数字)。
Integer number = 15;
句法:
ClassName object = value;
// of primitive data type associated with the wrapper class.
例子:
Java
// Importing input output classes
import java.io.*;
// Main class
class GFG {
// Main driver method
public static void main (String[] args) {
// Creating Instances using AutoBoxing
Integer num1 = 5;
Integer num2 = 5;
boolean bool = (num1 == num2);
System.out.println(bool);
}
}
true
输出说明:
num1 和 num2 都指向堆中相同的内存位置,正如我们在valueOf()方法中讨论的那样。