String []的替代方案?

时间:2015-07-17 11:42:53

标签: java arrays string performance memory-management

我有一个要求,我需要从文件中读取带标签的分隔数据,并将其与特定键放在地图中。现在,我正在做什么来分割数据,创建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在内存方面总是很昂贵。所以我正在寻找更好的方法来解决这个问题。

感谢您的帮助。

2 个答案:

答案 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初始化它。