Java中,String str = "Runoob";这个语句中str和“Runoob”都占空间吗?分别占多大?

新手上路,请多包涵

题目描述

1,"Runoob"这个字面值是在方法区的常量池中,它占多大空间?

2,str是存在栈区吗?它又占多大空间呢?是占一个

char型大小的空间吗?

3,str是存放的"Runoob"的值还是它的地址呢?

阅读 1.2k
1 个回答
  1. 不一定,下面说
  2. 是;一般是4字节;不是,char一般2字节(但是也不一定,和1同理)
  3. 引用,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[]charbyte都是2字节),数组虽然特殊,但是道理是一样的,以“Runoob”为例:

  • 对象头:12字节
  • 保存length的int:4字节
  • 元素大小 * 元素大小,这里是 2 * 6 = 12个字节
  • 上面加起来 28字节,对齐之后是 32字节

参考:

  1. https://stackoverflow.com/que...
  2. https://www.baeldung.com/java...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题