【发布时间】:2016-01-12 10:50:18
【问题描述】:
查看了实现,但无法想到对此的解释,但也许这里有人会知道。
public static void main(String[] args) throws Exception {
List<String> emptyStrings = new ArrayList<String>();
List<String> emptySubStrings = new ArrayList<String>();
for (int i = 0; i < 20000; i++) {
String actuallyEmpty = "";
String subStringedEmpty = " ";
subStringedEmpty = subStringedEmpty.substring(0, 0);
emptyStrings.add(actuallyEmpty);
emptySubStrings.add(subStringedEmpty);
}
System.out.println("Substring test");
// Write to files
long time = System.currentTimeMillis();
writeObjectToFile(emptyStrings, "empty.list");
System.out.println("Time taken to write empty list " + (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
writeObjectToFile(emptySubStrings, "substring.list");
System.out.println("Time taken to write substring list " + (System.currentTimeMillis() - time));
//Read from files
time = System.currentTimeMillis();
List<String> readEmptyString = readObjectFromFile("empty.list");
System.out.println("Time taken to read empty list " + (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
List<String> readEmptySubStrings = readObjectFromFile("substring.list");
System.out.println("Time taken to read substring list " + (System.currentTimeMillis() - time));
}
private static void writeObjectToFile(Object o, String file) throws Exception {
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream oout = new ObjectOutputStream(out);
oout.writeObject(o);
oout.flush();
oout.close();
}
private static <T> T readObjectFromFile(String file) throws Exception {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
return (T) ois.readObject();
} finally {
ois.close();
}
}
这两个列表最终包含 20,000 个空字符串(一个列表包含 "" 空字符串,另一个包含由 substring(0,0) 生成的空字符串)。但是,如果您检查生成的序列化文件(empty.list 和 substring.list)的大小,您会注意到 empty.list 包含更多的数据。
我注意到,取消序列化这些子字符串对象的远程 EJB 的调用者似乎也存在严重的性能问题。
【问题讨论】:
-
您可能想在某处添加一个实际问题。
-
可能是实习生与非实习生的案例。如果您在空子字符串上调用
String#intern()会发生什么? -
你能仔细检查一下它是不是更大的空列表吗?
-
是的,原来的 empty.list 更大,似乎对实习对象的序列化引用大于新的空字符串对象?但尚未证实这一点。
标签: java string serialization substring