如果你像这样在java中声明一个字符串数组
String[] words;
这只是给你一个引用,对吗?
现在,我有 C 背景,所以我知道 C 中的“字符串”数组是指向指针的指针,或者数组的数组。但是,我想知道 JVM 是如何使用这个声明的……它只是一个引用吗?那么当你给它足够的内存时,它也会给字符串不同的长度吗?
这对我来说有点难以描述,但我知道字符串只是字符数组,那么 JVM 如何在分配字符串之前确定字符串的长度?它是否重新分配了一个全新的字符串数组,并更新了新的字符串长度。
char array[6][6]; //in C this is necessary because it needs to know the column and row length
类似这个
char* array[5]; // you still need to malloc the slots in the array for a two dimensional length to be achieved
但在 java 中我不知道它是如何工作的
String line = null;
try {
while ((line = bfr.readLine()) != null) {
if (StringUtils.isBlank(line))
continue;
System.out.println(line);
String[] chunks = line.split(","); //this line right here, how does JVM allocate proper memory
MindsparkPartnerCode record = new MindsparkPartnerCode();
record.setIEFFCode(chunks[0]);
records.add(record);
最佳答案
好吧,你真的在这里问了两个问题。
首先,declaring一个数组(任何深度)不在 Java 中分配内存,而在你的 C 示例中你声明和定义一个数组,它确实分配内存。
Java:
String[] words; // Just a reference (null at this point) -- no memory allocated
C:
char array[6][10]; // *Does* allocate 60 bytes of memory, usually on the stack.
在 Java 中,在使用 new
运算符之前不会分配内存(当然,对于基元而言除外)。
Foo bar; // Just a reference
bar = new Foo(); // NOW memory has been allocated.
new
返回对新对象的引用。将所有不是原始类型的东西都视为引用(这包括数组!)。
字符串也不异常(exception)。
String[] foo;
... 只是对String 对象引用数组 的引用。仅此而已。
即使你创建数组...
foo = new String[20];
... Java 分配 20 * sizeof(JavaReference)
字节(其中 JavaReference
是 JVM 用来表示引用的任何底层类型)。因此,数组的大小现在已知。
当您实际向该数组添加字符串时...
foo[0] = "Hello!"; // Which is essentially...
foo[0] = new String("Hello!");
... THAT 是当您告诉 JVM 您的字符串有多长,从而告诉它分配 (strlen("Hello!") + 1) * 2
字节(因为 Java 以 UTF-16 编码存储其字符串)。
同样,请记住 strings are immutable ,因此 JVM 不必担心重新分配
它们。
关于字符串的问题对于 Java 来说很棘手,因为 Java 将原本只是另一个类 (String
) 的东西转换成语言结构(如上一个代码示例所示)。难怪在考虑内存和分配时字符串会令人困惑。
关于java - JVM是怎么分配这 block 内存的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348300/