我想编写自定义文本区域小部件,为此我需要找到存储文本文档的好方法。 由于我需要能够编辑它,我需要在任何位置轻松访问任何行和char。
然后我的想法是将文档存储为字符列表的列表:List<List<Character>> lines
(使用ArrayList实现)。
这种方法有效,我可以轻松访问line / char,但最令我惊讶的是内存使用情况。
我生成了一个包含10万个字符的文件并将其加载到结构中。
List<List<Character>> lines = new ArrayList<List<Character>>();
List<Character> line;
BufferedReader br = new BufferedReader(new FileReader(file));
for(String str; (str = br.readLine()) != null; ) {
line = new ArrayList<Character>();
for (char c : str.toCharArray())
line.add(c);
lines.add(line);
}
100k个字符需要 ~1.1GB 的内存!我将它与C#进行了比较,采用相同的方法,只需要约350 MB。
当然它仍然是很多内存,考虑到事实char
在Java / C#中是2个字节,然后是100000000个字符= ~190MB,其余是List / ArrayList内存。
我知道Java是内存使用者,但它是如何实现的却需要Java中的大量内存? (特别是考虑到C#只占用350mb而且两者都是同一级语言) 那么存储文本文档的更好方法是什么?
修改
List<StringBuilder>
的内存使用情况:
Java
:~500MB
C#
:~300MB
C#代码:
List<List<char>> lines = new List<List<char>>();
string str;
while ((str = file.ReadLine()) != null)
{
List<char> line = new List<char>();
foreach (char c in str)
line.Add(c);
lines.Add(line);
}
答案 0 :(得分:1)
只需使用ArrayList<String>
即可。您可以使用charAt()在String中的任何位置访问任何char,并且很容易在String中插入更多字符。