题目描述1,"Runoob"这个字面值是在方法区的常量池中,它占多大空间?2,str是存在栈区吗?它又占多大空间呢?是占一个char型大小的空间吗?3,str是存放的"Runoob"的值还是它的地址呢?
不一定,下面说是;一般是4字节;不是,char一般2字节(但是也不一定,和1同理)引用,java的世界里用“引用”对象的大小,说白了就是 对象头的大小 + 字段的大小 + 对齐不同java版本,不同jvm实现,一些细节会有区别,这里引入一个库:jol,然后执行下面的代码,就可以得到 String 的大小:System.out.println(ClassLayout.parseClass(String.class).toPrintable());在zulu jdk11下运行,输出如下:java.lang.String object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 4 byte[] String.value N/A 16 4 int String.hash N/A 20 1 byte String.coder N/A 21 3 (loss due to the next object alignment) Instance size: 24 bytes Space losses: 0 bytes internal + 3 bytes external = 3 bytes total对象头:12字节内容数组的引用:4字节保存哈希的int:4字节保存编码的byte:1字节上面加起来21字节,要8字节对齐所以还要补3字节到24字节于是,在我的环境里,一个 String 对象的大小是:24字节所以 String 的大小其实是固定的,会变的是保存字符串内容的数组的大小(java9之前是char[],后面是byte[],char和byte都是2字节),数组虽然特殊,但是道理是一样的,以“Runoob”为例:对象头:12字节保存length的int:4字节元素大小 * 元素大小,这里是 2 * 6 = 12个字节上面加起来 28字节,对齐之后是 32字节参考:https://stackoverflow.com/que...https://www.baeldung.com/java...
对象的大小,说白了就是 对象头的大小 + 字段的大小 + 对齐
不同java版本,不同jvm实现,一些细节会有区别,这里引入一个库:jol,然后执行下面的代码,就可以得到 String 的大小:
在zulu jdk11下运行,输出如下:
所以 String 的大小其实是固定的,会变的是保存字符串内容的数组的大小(java9之前是
char[]
,后面是byte[]
,char
和byte
都是2字节),数组虽然特殊,但是道理是一样的,以“Runoob”为例:参考: