在java中创建的无序映射

所以我需要有一些多字符的字符,其中添加一个重复的字符会将基数增加1,并且字符的多样性不应该大大增加对象占用的内存。

这将通过某种地图实现,其中字符是键,其中包含表示该字符在集合中表示的数字的值。

但是,我正在努力弄清楚哪个集合最适合这个(我正在查看hashmap)以及如何声明这种数据类型。 我正在做这样的事情

Map m = new HashMap(char, int); 

但以上是一个不正确的声明,我不知道如何正确处理这个问题。

试试这个声明:

 Map m = new HashMap(); 

然后,您可以添加字符:

 char c = //...; if (m.containsKey(c)) m.put(c, m.get(c) + 1); else m.put(c, 1); 

我将使用int[] (对于ASCII)或int[][]为unicode实现它。 给定在哈希映射中存储盒装整数的内存占用,其中使用数字引入所有散列冲突,并且字符只是数字,而不是键。

 public class CharacterBag { private int[][] data = new int[255][]; public void add(char ch) { int[] bin = data[ch >> 8]; if (bin == null) bin = data[ch >> 8] = new int[255]; bin[ch & 0xFF]++; } public int frequency(char ch) { int[] bin = data[ch >> 8]; if (bin == null) return 0; return bin[ch & 0xFF]; } } 

这开始于内存占用为零,并为每个unicode页面添加2K。 通常,文本使用来自一个或两个unicode页面的字符。

相比之下,使用HashMap将存在将盒装基元存储在链表列表中的全部开销。 对于每个字符,将有一个Entry类的对象,其中两个指针指向一个盒装键,一个链接列表对象及其所有字段,它包含一个Node类的对象,带有一个前向和后向指针,并且有一个指向盒装整数……我还能继续吗? ;)

 Map charCount = new HashMap(); public void addCharacter(char c) { Integer value = charCount.get(c); if (value == null) { charCount.put(c, 1); } else { charCount.put(c, value + 1); } } 

Java集合不允许您创建基本类型的集合,而是应该使用它们各自的包装类(例如,int的包装类是Integer)。

 Map hashMap = new HashMap(); 

这是你如何申报地图。 有关更多示例和说明,请查看此处

根据我的最好方法是使用构造函数:

 Map orgMap = new HashMap(); Map copyMap; copyMap= new HashMap(map); 

把事情简单化。