java - JVM是怎么分配这 block 内存的

标签 java arrays string

如果你像这样在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/

相关文章:

java - 设置 JAVA_HOME ubuntu : path not found

php - 如何使用 PHP 根据嵌套命名空间数组中的值对数组进行排序

java - 一种算法,以检查是否最多可以通过插入或删除一个字符来从另一个字符串中获得一个字符串?

c++ - 可以输入单词的计算器

java - 使用java从MySQL DB检索数据

java - java 的球形几何库

java - 为什么我们要实现标记接口(interface),即使它们不包含任何方法?

python - numpy 数组指标操作

C - 创建具有与输入相关的数组数量的结构

java - 为什么在 Java 中使用 copyValueOf 方法?