原始包装类在Java中是不可变的
在Java中,不可变类是一个类(Integer、Byte、Long、Float、Double、 字符、Boolean 和 Short),一旦创建就不能更改其主体,同样适用于一旦创建就无法更改的不可变对象.现在出现的问题是,在处理Java中的原始数据类型时,我们确实需要包装类的帮助,而这些类是不可变的。
极客们,现在您一定想知道为什么我们将它们设置为不可变的,为此我们将列出一些优点,如下所示:
- 它们会自动同步,因为它们的状态不能通过不变性的定义而改变。
- 由于无法更改包装类的对象,因此不一致的范围为零。
- 它有助于缓存,因为特定类型的一个实例本身可以促进十几个应用程序。
Tip: Best usage of wrapper classes as immutable objects is as keys of the Map.
例子:
Java
// Java Program to Demonstrate that Primitive
// Wrapper Classes are Immutable
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Getting an integer value
Integer i = new Integer(12);
// Printing the same integer value
System.out.println(i);
// Calling method 2
modify(i);
// Now printing the value stored in above integer
System.out.println(i);
}
// Method 2
// To modify integer value
private static void modify(Integer i) { i = i + 1; }
}
输出:
输出说明:
这里参数'i'是修改时的引用,与main()中的'i'引用相同的对象,但对'i'所做的更改不会反映在main()方法中。这是因为所有原始包装类(Integer、Byte、Long、Float、Double、 字符、Boolean 和 Short)在Java中都是不可变的,所以像加法和减法这样的操作会创建一个新对象,而不是修改旧对象。
modify 方法中的以下代码行对包装类 Integer 进行操作,而不是 int,并按如下所述执行以下操作:
i = i + 1;
- 将“i”拆箱为 int 值
- 将该值加 1
- 将结果装箱到另一个 Integer 对象中
- 将生成的整数分配给“i”(从而更改“i”引用的对象)
由于对象引用是按值传递的,因此在修改后的方法中采取的操作不会改变在修改调用中用作参数的 i。因此,在方法返回后,主例程仍会打印 12。