java - 不可变类型包装器

标签 java immutability

执行以下代码时,我对类型包装器的不可变性感到困惑

static void inc(Integer nr)
{
    System.out.printf("1. inc() \t %d \n", nr);
    nr++;
    System.out.printf("2. inc() \t %d \n", nr);
} // inc()

public static void main(String[] args)
{
    Integer nr1 = 10;
    System.out.printf("a. main() \t %d \n", nr1);
    inc(nr1);
    System.out.printf("b. main() \t %d \n", nr1);
} // main()

执行它会创建以下输出

  a. main()     10 
  1. inc()      10 
  2. inc()      11 
  b. main()     10 

如果类型包装器是不可变的,那么为什么行“1.inc”和“2.inc”之间的值会增加 行“b.main”打印的值是否与“1.main”相同?

谢谢

克里斯

最佳答案

If a type wrapper is immutable, why then is the value increased between line "1. inc" and "2. inc"

因为你实际上并没有改变现有的 Integer 对象 - 你正在创建一个新的对象(嗯,有效 - 实际上它会使用常见的缓存对象,但重点是值nr 将引用 nr++ 之后的不同对象)。想一想:

nr++;

作为替代:

int tmp = nr.intValue();
tmp++;
nr = Integer.valueOf(tmp);

因此,您看到 nr 的文本表示形式发生变化并不意味着它所引用的对象已发生变化 - 在本例中,原因是 nr > 本身具有新的值,引用不同的对象。

您也可以通过更多诊断来看到这一点:

static void inc(Integer nr)
{
    Integer original = nr;
    System.out.printf("1. inc() \t %d \n", nr);
    nr++;
    System.out.printf("2. inc() \t %d \n", nr);
    // This will print 10
    System.out.printf("Original: %d\n", original);
} 

and does line "b. main" print the same value as "1. main"?

一如既往,引用按值传递。这意味着 inc(nr1) 根本不会修改 nr1 - 它引用之前所做的同一个对象。正如我上面所说, inc also 不会修改对象(因为包装器类型是不可变的)。因此,在调用之后,nr1 引用包装相同值 (10) 的同一对象。

关于java - 不可变类型包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30941854/

相关文章:

java - 线程中的异常 "main"java.lang.IndexOutOfBoundsException : Index: 0, 大小 : 0?

java - 空白index.jsp重定向到某个servlet

rust - 借用为迭代器可变后,在循环内借用为不可变

c# - 在不可变对象(immutable对象)上创建一个 "with"方法

java - 在 Java 中使 session 中的对象不可变

c++ - 集合中的不可变对象(immutable对象)(C++ 和 Qt)

java - 如何检索特定短信的联系方式?

java - Android 库中的 Android NoClassDefFound

java - 准备正则表达式来解析简单字符串

python获取linux文件不可变属性