English 中文(简体)
Java, HashMaps and using Strings as the keys - does the string Value have contributed two?
原标题:Java, HashMaps and using Strings as the keys - does the string value get stored twice?

如果我有这样的希望:

HashMap<String, MyObject>

<代码>String key is a field in MyObject,该示意图是否得到两次储存?

因此,当我增加条目时:

_myMap.put(myObj.getName()、我的Obj);

在记忆方面,我用两倍的强力大小? 或 Java在幕后做什么?

增 编

最佳回答

Java使用这一提法,因此,它只是其储存的两倍之多。 因此,如果你的扼杀是巨大的,那么你就不必担心,那将仍然是同样的记忆。

问题回答

除非您在getName(>上重新计算,否则你不会重复你的记忆使用。

下面是澄清问题的几个例子:

 String s1 = "Some really long string!";
 String s2 = s1;
 assert s1.equals(s2);

这里,s1 = s2;>指同一<代码>String/code>。 您的记忆使用是2个参考变量(无大体)、1个<代码> 标准例和1 背后<代码>char[]。 (承担记忆的部分)。


 String s1 = "Some really long string!";
 String s2 = new String(s1);
 assert s1.equals(s2);

这里,s1 != s2;>指不同的<代码>String/code>。 然而,由于扼杀是不可改变的,施工者知道他们能够分享同样的特性阵列。 您的记忆使用是2个参考变量,2String(不含大体,因为......)和1个背式<代码>。


 String s1 = "Some really long string!";
 String s2 = new String(s1.toCharArray());
 assert s1.equals(s2);

这里,与前面一样,s1 != s2。 但是,现在使用的是不同的构造者,代之以<条码>。 为确保互换性,toCharArray(>>>>>>m> 须交回其内部阵列的防御拷贝(这样,对返回阵列的任何改动都不会改变现值)。

[toCharArray( > tur]a Emerg 分批的特性阵列,其长度为这一条形状的长度,其内容的初始化是为了包含这一条令所代表的特性顺序。

更糟糕的是,施工人必须同时防御地复制其内部支持阵列的<>m>,以确保互换性。 这意味着,“......”在性质阵列的3份上可能同时生活在记忆中! 其中1个将最终收集垃圾,因此,你的记忆使用是2个参考变量,2个<代码> 标准例,和2支持<代码>char[]! 你们的记忆使用加倍!


因此,如果你重新在<条码>上不再产生新的强项价值,(即,如果你只是<条码>重新回到这个名称;),那么你将重罚。 但是,如果你做的是简单的分类(例如return this.firstName + this.lastName;),那么you将重复你的记忆使用!

以下守则表明了我的观点:

public class StringTest {
    final String name;
    StringTest(String name) {
        this.name = name;
    }
    String getName() {
        return this.name;      // this one is fine!
    //  return this.name + ""; // this one causes OutOfMemoryError!
    }
    public static void main(String args[]) {
        int N = 10000000;
        String longString = new String(new char[N]);
        StringTest test = new StringTest(longString);
        String[] arr = new String[N];
        for (int i = 0; i < N; i++) {
            arr[i] = test.getName();
        }
    }
}

您首先应核实上述代码的操作(java -Xmx128m String Test),而不提出任何例外。 然后修改getName( to >return this.name +";,并再次加以管理。 届时,您将获得<代码>。 OutOfMemoryError。

努力是不可改变的,但通过优惠的办法仍然适用。 因此,它赢得了两倍的记忆。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...