如何将一个空字符串内部存储在内存中?我当时在考虑一个空的字符串内存表示形式,但我不太理解。是否有一些特定的ASCII值?到底什么是空字符串?
答案 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)
所有字符串都是只读的,也就是说,内存块可以 初始化后无法调整大小。在某些代码中,我们可以看到
str1 = str1 + str2
,但实际上,由于写时复制规则,str1
的大小尚未调整。
系统重新分配一个新的内存块来存储新结果,并
将str1
的指针更改为新的指针。
从根本上说,字符串是一个数组;空字符串只是一个没有元素的字符数组,长度为0,但空字符串和非空字符串之间没有区别。他们两个都有一个内存地址,即指针。
如果您知道C / C ++中的字符串指示符,它只是一个char *指针,它始终以'\0'
字符结尾。当您读取字符串时,将有一个循环,将char *指针从第一个地址移动到下一个地址,直到到达'\0'
。因此,Java中的空字符串只是一个char *指针,其后紧跟'\0'
。