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);
    }