gpt4 book ai didi

java - Java原语是不可变的吗?

转载 作者:IT老高 更新时间:2023-10-28 20:55:09 25 4
gpt4 key购买 nike

如果一个方法有一个局部变量i:

int i = 10;

然后我分配一个新值:

i = 11;

这会分配一个新的内存位置吗?还是直接替换原来的值?

这是否意味着原语是不可变的?

最佳答案

Will this allocate a new memory location? Or just replace the original value?

Java 并没有真正保证变量将对应于内存位置。例如,您的方法可能会以 i 存储在寄存器中的方式进行优化 - 或者甚至可能根本不存储,如果编译器可以看到您从未实际使用它的值,或者如果它可以通过代码跟踪并直接使用适当的值。

但把它放在一边。 . .如果我们在这里抽象为局部变量表示调用堆栈上的内存位置,那么 i = 11 将简单地修改该内存位置的值。它不需要使用新的内存位置,因为变量 i 是唯一引用旧位置的东西。

Does this mean that primitives are immutable?

是与否:是的,原语是不可变的,但不,这不是因为上述原因。

当我们说某些东西是可变的时,我们的意思是它可以被改变:改变但仍然具有相同的身份。例如,当你长出头发时,你正在改变自己:你仍然是你,但你的一个属性是不同的。

在原语的情况下,它们的所有属性完全由它们的身份决定; 1 总是表示 1,无论如何,1 + 1 总是 2。你无法改变它。

如果给定的 int 变量具有值 1,您可以将其更改为具有值 2,但这是一个完全的变化身份:它不再具有与以前相同的值(value)。这就像将 me 更改为指向其他人而不是指向我:它实际上并没有更改 me,它只是更改了 me

当然,你通常可以同时使用对象:

StringBuilder sb = new StringBuilder("foo");
sb.append("bar"); // mutate the object identified by sb
sb = new StringBuilder(); // change sb to identify a different object
sb = null; // change sb not to identify any object at all

通俗地说,这两者都将被描述为“改变sb”,因为人们会使用“sb”来指代变量 (包含一个引用)和它所引用的 object (当它引用一个时)。这种松散是可以的,只要你记住重要的区别。

关于java - Java原语是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com