Java:通过UUID与DisplayName访问同一对象,如何优化内存占用?
优化内存存储方案的建议
首先,你的场景里数据加载后就不再变更,所以WeakReference完全没必要——因为这些Cosmetic对象从启动到结束都会被cosmeticIDs强引用,根本不会被GC回收,用WeakReference反而多了一层包装,既浪费内存又增加了访问时拆包的开销。
最优实现方式
- 调整第二个Map的类型,直接存储Cosmetic的强引用:
private Map<String, Cosmetic> cosmeticIDs; private Map<String, Cosmetic> cosmeticsDisplayNames; - 插入数据时直接存入对象本身(两个Map指向同一个实例,内存仅存一份Cosmetic对象):
Cosmetic cosmetic = new Cosmetic(uuid, displayName); cosmeticIDs.put(cosmetic.getID(), cosmetic); cosmeticsDisplayNames.put(cosmetic.getDisplayName(), cosmetic);
额外注意事项
如果存在多个Cosmetic对应同一个DisplayName的场景,需要将第二个Map改为Map<String, List<Cosmetic>>,把相同DisplayName的对象统一存入列表中,避免键值覆盖问题。
内容的提问来源于stack exchange,提问作者Benna
相关产品推荐
相关产品推荐

