说我有以下类(class):
public class Tagged {
private List<String> tags;
}
public class ContainerOfTagged {
private List<Tagged> tagged;
}
通过这种结构,每当我需要查找带有特定标签的
Tagged
时,都需要遍历ContainerOfTagged
中的所有标签,并遍历每个Tagged
的所有标签。这可能会影响性能,具体取决于列表的大小。一个简单的解决方案是将
ContainerOfTagged
类更改为使用Map
,在Tagged
列表中映射标签:public class ContainerOfTagged {
private Map<String, List<Tagged>> tagMapping;
}
现在,我需要做的就是提供一个标签,
Map
将返回带有所述标签的所有Tagged
。但是,这样做会导致数据重复,因为Tagged
和ContainerOfTagged
类中都存在相同的标记。因此,有没有办法使用不重复数据的高性能解决方案来解决此问题?
最佳答案
您不能真正避免“复制”标签,但是请记住您并没有真正复制它们,因为“列表”和“ map ”仅存储对标签字符串的引用,而不是值的存储(但是,引用可能会占用很多时间)本身的空间)。
问题是您需要两个索引:
理想情况下,您的解决方案应如下所示。您可以通过一种方法来管理标记,从而解决对不同步问题的担忧。
请注意,在
Tagged
中,应使用Set而不是列表,以避免标签重复。public class Tagged {
Set<String> tags;
}
public class TagContainer {
Map<String, Tagged> tagIndex;
public tag(String tag, Tagged tagged) {
tagged.tags.add(tag);
tagIndex.put(tag, tagged);
}
如果内存利用率是主要问题,则可以尝试某种引用压缩。使用此技术,您可以将标签存储在数组中,然后按索引引用它们。如果数量不足,则可以使用字节或短字节代替引用,但是代码会更加困惑,我不建议这样做。
编辑:
在我的第一篇文章中,我建议Tagged应该是一个称为Tagable的接口(interface)。这样比较干净,但是延长了解决方案的时间,所以我回到了一个类。但是,您也许可以考虑具有Tagable接口(interface),并在Tagged类中实现此接口(interface)。
public interface Tagable {
Set<String> getTags;
tag(String tag);
}
关于java - 性能结构,无数据重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39193358/