如果我有这样的希望:
HashMap<String, MyObject>
<代码>String key is a field in MyObject
,该示意图是否得到两次储存?
因此,当我增加条目时:
_myMap.put(myObj.getName()、我的Obj);
在记忆方面,我用两倍的强力大小? 或 Java在幕后做什么?
增 编
如果我有这样的希望:
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。
努力是不可改变的,但通过优惠的办法仍然适用。 因此,它赢得了两倍的记忆。
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 ...
Check this, List<String> list = new ArrayList<String>(); for (int i = 0; i < 10000; i++) { String value = (""+UUID.randomUUID().getLeastSignificantBits()).substring(3, ...
I am in the middle of solving a problem where I think it s best suited for a decorator and a state pattern. The high level setting is something like a sandwich maker and dispenser, where I have a set ...
I have been trying to execute a MS SQL Server stored procedure via JDBC today and have been unsuccessful thus far. The stored procedure has 1 input and 1 output parameter. With every combination I ...
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 ...
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 ...
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....
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 ...