如果发生内存变异,Java中的解包裹问题

如果发生内存变异,Java中的解包裹问题,java,Java,当我们将包装器对象展开为其各自的原语值(例如整数到整数)时,它是否会将一个新值存储到整数中,其中的值为4字节(4字节的大小),或者它是否会改变整数中的值并缩短其内存大小以转换为int?当您打开包装器对象时,会隐式调用一个方法,该方法返回对象所持有的基元类型。在Integer的情况下,调用的方法是。比如说。阅读更多信息。打开包装器对象时,会隐式调用一个方法,该方法返回对象所持有的原语类型。在Integer的情况下,调用的方法是。比如说。阅读更多信息。展开“整型对象将4字节int值从其内部复制到新的

当我们将包装器对象展开为其各自的原语值(例如整数到整数)时,它是否会将一个新值存储到整数中,其中的值为4字节(4字节的大小),或者它是否会改变整数中的值并缩短其内存大小以转换为int?

当您打开包装器对象时,会隐式调用一个方法,该方法返回对象所持有的基元类型。在
Integer
的情况下,调用的方法是。比如说。阅读更多信息。

打开包装器对象时,会隐式调用一个方法,该方法返回对象所持有的原语类型。在
Integer
的情况下,调用的方法是。比如说。阅读更多信息。

展开“整型对象将4字节
int
值从其内部复制到新的内存位置

整型对象不会以任何方式更改。

整型对象“展开”将4字节的
int
值从其内部复制到新的内存位置


整数对象不会以任何方式更改。

首先,我/我们假设您所说的“展开”是指

答案是,被解除绑定的对象不会发生“记忆突变”

  • 包装器类是不可变的1。因此,不会发生任何改变对象可见状态的情况

  • JLS声明,将(比如)一个
    Integer
    解装箱为
    int
    相当于调用
    Integer.intValue()
    Integer.intValue()
    的javadoc没有提到突变

  • 一般来说,实际上没有必要为了转换对象的值而对其进行变异。可以使用局部变量执行任何非平凡的转换,以保持所需的任何中间状态;e、 g

     SomeType convertToSomeType() {
         // Copy this.state variables to local variables
         // Convert using local variables
         return /* some value created from the local variables */
    
  • java.lang.Integer
    源代码的检查表明,它的实现如下2所示:

    那里没有突变

  • 在JVM级别,没有办法缩短简单Java对象的内存大小。堆节点不会增长或收缩

  • 如果(假设!)可以收缩Java堆节点,那么堆节点大小是8字节的倍数。因此(比如)将
    整数中的值从4字节减少到2字节实际上不会导致更小的堆节点

  • 如果(假设!)有一种实用的方法来优化
    整数
    或任何其他包装类的内存使用,那么应该在创建包装对象时进行优化(或者在允许的情况下对其进行变异)。。。拆开包装的时候不会


  • 1-我惊讶地发现JLS或javadocs都没有明确说明这一点。然而,从他们所说的很清楚,标准的原语包装类必须是不可变的。例如,如果
    Integer
    值是可变的,则JLS中指定的
    Integer
    缓存行为将是不健全的


    善意的谎言。在Java的某些版本中,方法上有一个
    @hospotintrisccandidate
    注释。但是JIT编译器可能做的任何事情都会涉及到对
    Integer
    对象的变异,这是难以置信的。

    首先,我/我们假设你说的“展开”是指

    答案是,被解除绑定的对象不会发生“记忆突变”

  • 包装器类是不可变的1。因此,不会发生任何改变对象可见状态的情况

  • JLS声明,将(比如)一个
    Integer
    解装箱为
    int
    相当于调用
    Integer.intValue()
    Integer.intValue()
    的javadoc没有提到突变

  • 一般来说,实际上没有必要为了转换对象的值而对其进行变异。可以使用局部变量执行任何非平凡的转换,以保持所需的任何中间状态;e、 g

     SomeType convertToSomeType() {
         // Copy this.state variables to local variables
         // Convert using local variables
         return /* some value created from the local variables */
    
  • java.lang.Integer
    源代码的检查表明,它的实现如下2所示:

    那里没有突变

  • 在JVM级别,没有办法缩短简单Java对象的内存大小。堆节点不会增长或收缩

  • 如果(假设!)可以收缩Java堆节点,那么堆节点大小是8字节的倍数。因此(比如)将
    整数中的值从4字节减少到2字节实际上不会导致更小的堆节点

  • 如果(假设!)有一种实用的方法来优化
    整数
    或任何其他包装类的内存使用,那么应该在创建包装对象时进行优化(或者在允许的情况下对其进行变异)。。。拆开包装的时候不会


  • 1-我惊讶地发现JLS或javadocs都没有明确说明这一点。然而,从他们所说的很清楚,标准的原语包装类必须是不可变的。例如,如果
    Integer
    值是可变的,则JLS中指定的
    Integer
    缓存行为将是不健全的

    善意的谎言。在Java的某些版本中,方法上有一个
    @hospotintrisccandidate
    注释。但是JIT编译器可能做的任何事情都会涉及到对
    Integer
    对象进行变异,这是难以置信的;int y=8;y=x
    编写此代码,然后使用
    javap
    查看编译器的实际功能,它被称为“unbox”,而不是“unwrap”。2)对象不能按照您的想法转换为原语,
    Integer
    不是“shorten”为
    int
    。1)
    Integer x=12;int y=8;y=x
    编写此代码,然后使用
    javap
    查看编译器的真正功能,它被称为“unbox”,而不是“unwrap”。2)对象可以