我有一个要求,我需要从文件中读取带标签的分隔数据,并将其与特定键放在地图中。现在,我正在做什么来分割数据,创建String []并将其放入hashmap。我如何做的示例代码如下:
while ((line = bufferedReader.readLine()) != null) {
String[] data = line.split("\t");
myHashMap = new HashMap<String, String>();
for (int i = 0; i < data.length; i++) {
myHashMap.put("<key>"+i,data[i]);
}
<additional logic>
}
问题是我必须阅读近2500个文件,每个文件大约有1000行。这导致高内存使用和性能问题。据我所知,String在内存方面总是很昂贵。所以我正在寻找更好的方法来解决这个问题。
感谢您的帮助。
答案 0 :(得分:0)
您真的需要将您的信息存储到地图中吗?
如果答案为否,您可以将其存储在列表中。
while ((line = bufferedReader.readLine()) != null) {
String[] data = line.split("\t");
myList = new ArrayList<String>(data.length);
for (int i = 0; i < data.length; i++) {
myList.add(data[i]);
}
// To get the elements, instead of using:
myHashMap.get("<key>" + i);
// use:
myList.get(i);
//<additional logic>
}
我考虑你关闭文件/缓冲区。
while ((line = bufferedReader.readLine()) != null) {
List<String> myList = Arrays.asList(line.split("\t"));
// To get the elements, instead of using:
myHashMap.get("<key>" + i);
// use:
myList.get(i);
//<additional logic>
}
除非你为哈希地图使用不同的密钥,否则你应该只使用数组的索引。
while ((line = bufferedReader.readLine()) != null) {
String[] data = line.split("\t");
// To get the elements, instead of using:
myHashMap.get("<key>" + i);
// use:
data[i];
//<additional logic>
}
答案 1 :(得分:0)
如果您遇到大量字符串问题(根据您的估算,您可能会阅读大约250万条条目,那么您可能会这样做),read up on String interning并相应地设置-XX:StringTableSize=N
。< / p>
我不明白为什么您希望将HashMap有效地用作数组,但如果您真的想这样做,请确保使用大约正确的initialCapacity and loadFactor初始化它。