不一定,下面说
是;一般是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字节
参考: