鍍金池/ 問答/Java  Python  網(wǎng)絡(luò)安全/ String類型的實例屬性在內(nèi)存中的偏移量不隨字符串的長度變化而改變?

String類型的實例屬性在內(nèi)存中的偏移量不隨字符串的長度變化而改變?

public class A {
  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    //System.out.println(  ClassLoader.getSystemClassLoader().toString());
    Unsafe unsafe = UnsafeUtil.getUnsafe();
    Person person = new Person();
    long offset = unsafe.objectFieldOffset(person.getClass().getDeclaredField("name1"));
    System.out.println(offset); // 16
    person.setName1("fasfsa321312");
    long offset1 = unsafe.objectFieldOffset(person.getClass().getDeclaredField("name1"));
    System.out.println(offset1);

  }

  private static class Person{
   // private int a;
    private String name;
    private String name1;
   // private static int c;
   // private int b;
    public void setName(String name){
      this.name = name;
    }

    public String getName(String name){
      return this.name;
    }

    public void setName1(String name){
      this.name1 = name;
    }

    public String getName1(String name){
      return this.name1;
    }
  }

  private static class UnsafeUtil {
    private static Unsafe getUnsafe() throws NoSuchFieldException, IllegalAccessException {
      Field field = Unsafe.class.getDeclaredField("theUnsafe");
      field.setAccessible(true);
      return (Unsafe) field.get(null);
    }
  }
}

輸出結(jié)果是:
16
16

我想知道的是為什么在字符串變化的時候內(nèi)存地址卻沒有變化??大佬們幫忙解答一下

回答
編輯回答
離觴

圖片描述
當(dāng)對象創(chuàng)建時,java對在內(nèi)存的堆、棧中分別創(chuàng)建這個對象,你對其屬性做的改變都是基于棧的操作,在更新完畢后,最后會更新到堆中,堆中地址是不會發(fā)生改變的,內(nèi)存地址就是堆的地址

2017年5月4日 09:08
編輯回答
陪我終

是我自己糊涂了,對象里存的是地址。

2017年1月24日 08:20