- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如果一个方法有一个局部变量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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!