String类型的实例属性在内存中的偏移量不随字符串的长度变化而改变?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当对象创建时,java对在内存的堆、栈中分别创建这个对象,你对其属性做的改变都是基于栈的操作,在更新完毕后,最后会更新到堆中,堆中地址是不会发生改变的,内存地址就是堆的地址
是我自己糊涂了,对象里存的是地址。