空字符串的内存表示

时间:2018-08-30 07:23:55

标签: java string null

如何将一个空字符串内部存储在内存中?我当时在考虑一个空的字符串内存表示形式,但我不太理解。是否有一些特定的ASCII值?到底什么是空字符串?

2 个答案:

答案 0 :(得分:1)

String对象是Java Object,就像其他对象一样。它是一个具有长度属性的对象,该属性最终以int的形式存储在Java对象中。空的String的长度为0,因此长度为int == 0。在实际的实现中,String对象在内部具有对char[]对象(char的数组)的引用。

对于空的String,引用可能null。在理论中,String实现可能始终具有非null数组引用,并且将char s数组的长度用作String长度int,在这种情况下,您的问题将等同于询问空数组的内存表示形式。

例如,请参见the OpenJDK implementation

 private final char value[];

是对字符数组的引用

 private final int count;

String的长度,如您所见,默认构造函数会创建一个空的String

 public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
 }

(您可能想知道为什么该实现有一个offset。这样子字符串可以与其父字符串共享相同的字符数组,从而在很多情况下减少了内存使用)。

答案 1 :(得分:-1)

  • 空字符串是长度为0的字符串。它与 长度大于0的字符串,因为它们都是 分配了一个内存块来存储变量。
  • 所有字符串都是只读的,也就是说,内存块可以 初始化后无法调整大小。在某些代码中,我们可以看到

      

    str1 = str1 + str2

    ,但实际上,由于写时复制规则,str1的大小尚未调整。 系统重新分配一个新的内存块来存储新结果,并 将str1的指针更改为新的指针。

  • 从根本上说,字符串是一个数组;空字符串只是一个没有元素的字符数组,长度为0,但空字符串和非空字符串之间没有区别。他们两个都有一个内存地址,即指针。

  • 如果您知道C / C ++中的字符串指示符,它只是一个char *指针,它始终以'\0'字符结尾。当您读取字符串时,将有一个循环,将char *指针从第一个地址移动到下一个地址,直到到达'\0'。因此,Java中的空字符串只是一个char *指针,其后紧跟'\0'