String类型的实例属性在内存中的偏移量不随字符串的长度变化而改变?

发布于 2022-09-07 19:35:36 字数 1371 浏览 23 评论 0

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);
    }
  }
}

输出结果是:
16
16

我想知道的是为什么在字符串变化的时候内存地址却没有变化??大佬们帮忙解答一下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巨坚强 2022-09-14 19:35:36

图片描述
当对象创建时,java对在内存的堆、栈中分别创建这个对象,你对其属性做的改变都是基于栈的操作,在更新完毕后,最后会更新到堆中,堆中地址是不会发生改变的,内存地址就是堆的地址

北城孤痞 2022-09-14 19:35:36

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文