Java 无重复数据的性能结构
假设我有以下课程:Java 无重复数据的性能结构,java,Java,假设我有以下课程: public class Tagged { private List<String> tags; } public class ContainerOfTagged { private List<Tagged> tagged; } 现在我需要做的就是提供一个标记,Map将返回带有所述标记的所有taged。但是,这样做会导致数据重复,因为在taged和containeroftaged类中都存在相同的标记 那么,有没有一种不复制数据的
public class Tagged {
private List<String> tags;
}
public class ContainerOfTagged {
private List<Tagged> tagged;
}
现在我需要做的就是提供一个标记,Map
将返回带有所述标记的所有taged
。但是,这样做会导致数据重复,因为在taged
和containeroftaged
类中都存在相同的标记
那么,有没有一种不复制数据的性能解决方案可以解决这个问题呢?您不能真正避免“复制”标记,但请记住,您并不是在真正复制它们,因为列表和映射只存储对标记字符串的引用,而不是值(然而,参考文献本身可能会占用大量空间)
问题是您需要两个索引:
中,应使用集合而不是列表,以避免重复标记
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);
}
已标记的公共类{
设置标签;
}
公共类标记容器{
地图标记索引;
公共标记(字符串标记,已标记){
taged.tags.add(tag);
tagIndex.put(tag,taged);
}
如果内存利用率是一个主要问题,您可以尝试某种引用压缩。使用这种技术,您可以将标记存储在数组中,然后通过索引引用它们。如果足够少,您可以使用字节或短字符代替引用,但代码会更混乱,我不推荐使用
编辑:
在我的第一篇文章中,我提出标签应该是一个称为标签的界面。这是一个更干净的,但是延长了解决方案,所以我回到了一个类。Howevever,你可以考虑有一个可标记的接口并在标记类中实现这个。
public interface Tagable {
Set<String> getTags;
tag(String tag);
}
可标记的公共接口{
设置getTags;
标签(字符串标签);
}
您的containeroftaged
中有这么多数据,以至于内存使用量真的是一个问题吗?不,如果您不想迭代,就无法避免重复。数组是一个选项吗?或者标记可以是一个枚举吗?另外,如果标记的数量合理,您可以为每个标记使用一个containeroftaged。@并且Turner内存使用量不是一个问题当时的问题。当前的问题是查找带有特定标记的所有标记时的性能。对此有一些解决方案,以前在本网站上用不同的公式提出过这些问题。其他问题将其描述为bi多重映射或N:M关系(使用数据库术语)。示例:和
public interface Tagable {
Set<String> getTags;
tag(String tag);
}