本人博客原文
当我们对中文名字排序时,往往采用是的用其拼音来排序的。Android中通过汉字的unicode编码来找到其对应的拼音。汉字unicode编码和其拼音是放在资源文件chinese_unicode_to__pinyin.txt中。
其结构很简单,比如:
示例1:
3007 ling
4E00 yi
4E01 ding
4E02 kao
它正好对应java.util.Properties所需要的格式。但是由于它继承于Hashtable,他使用的是哈希桶来把汉字unicode编码和其拼音对应,有很多哈希桶被创建而没实际使用,造成大量的哈希桶浪费,实际占用内存达2M多。
考虑到chinese_unicode_to__pinyin.txt本身的数据结构特点,我们在采用二维数组的索引来对应汉字unicode编码,第一维数组的下标对应汉字unicode编码的高8表,第二维数组的下标对应汉字unicode编码的低8表,第二维数组数存的字符串来对应汉字拼音的引用。如果在存一个汉字的拼音时,前面有汉字的拼音和他一样时,则使用这个该汉字的拼音的引用就可以了,而不必再创建新的字符串。
对于示例1的汉字和拼音就这样存储:
pinyinTable[0x30][0x0f]="ling"
pinyinTable[0x4E][0x00]="yi"
pinyinTable[0x4E][0x01]="ding"
pinyinTable[0x4E][0x02]="kao"
这样使用MAT查看占用内存就变为1M多,但是实际计算却主要是引用(一个引用占32位,即4个字节)占用的内存比较多,大概是6*(2~12)*4=96k
另外很多汉字的拼音都是相同,所以使用白盒测试显示字符串占用的更少。MAT显示的占用内存仍然有1M,应该是重复计算字符串引起的。