2013-04-24 41 views
1

考虑以下情况Java的 - 更好的模式来拯救的对象(集合)

1)我需要保存位置的类的对象(在我的应用程序定义)与 所有的用户(在我的应用程序定义)对象一起为收集如下图所示

HashMap<Location, Collection<Person>> 

而且数据存储象下面这样的HashMap在上述考试(作为对象,我提了解释名称)

Location1 - User1, User2, User3 
Location2 - User2, User3 
Location3 - User1 

现在在hashmap中,用户1,用户2和用户3的冗余副本存储在每个位置内。这是保存集合中一对多关系数据的正确方法吗?

+0

澄清你的意思是“保存”?这是存储在您的程序关闭后的磁盘..? – KyleM 2013-04-24 06:40:35

+0

我的意思是说,如果这仅仅是一个参考,由@Arjun饶指定..然后它的确定,以保持这种格式ONT消耗内存的用户1,用户2等,都保存在内部的HashMap集合对象..。 – balanv 2013-04-24 06:45:26

+2

我明白了。那么,看看我的答案和其他海报。这可能有帮助。保留你的格式是可以的,但考虑其他可能性可能是有用的,例如AmitD的答案。 – KyleM 2013-04-24 06:55:33

回答

4

没有“冗余”。所有的hashmap存储都是对同一个对象的引用。

0

无需HashMap。您可以将User包含在Location类中,因为它非常适合您的要求。

public class Location { 
    private Set<User> users = new HashSet<User>(); 

    public boolean addUser(User user) { 
     return users.add(user); 
    } 

    public boolean remove(User user) { 
     return users.remove(user); 
    } 

    public Set<User> getAll() { 
     return Collections.unmodifiableSet(users); 
    } 
} 
2

将包含在PERSON1信息只保存一次,除非你做了一些明确提出,对象的副本(通过使用clone()方法比如说,如果实现的话)

通常情况下,加像person1这样的对象不止一个集合不应该将一个全新的对象与第一个对象相同并放入集合中。发生什么事情是有多个引用到人对象被保存在不同的集合中。每个引用与整个新对象的大小相比都很小,并且虽然可能有多个对同一对象的引用,但由该Person对象管理的信息(例如名称,电子邮件等)仅存储一次。

因此:您对收藏集所做的工作很好,它不会创建对象的多个副本。

(在Java中没有指针,但如果你曾经学一门语言,使他们的想法是在多个较小的指针类似可以指向一个大的对象)

0
public class Location { 
    private Set<User> users = new HashSet<User>(); 

    public boolean addUser(User user) { 
     return users.add(user); 
    } 

    public boolean remove(User user) { 
     return users.remove(user); 
    } 

    public Set<User> getAll() { 
     return Collections.unmodifiableSet(users); 
    } 
} 

等同于阿米特的回答只是保留与您的Location相关的Set<User>。然后,您应另外使用ArrayList<Location>来存储您的所有Locations。正如Arjun指出的,没有冗余(重复的用户对象)。什么时候不会有冗余?每个User对象只创建一次,然后添加到多个集合中。这是因为参考User实际上是存储在集合中。这就是Java中“通过价值传递参考”的含义。例如,在列表的add方法中,您可以调用add(User),但是Java在后台执行的操作是将User对象的引用(思考内存位置)的副本传递给列表。所以List不直接存储用户对象,但它位于内存的某个地方。

+0

你的答案和@AmitDs答案有什么区别? – 2013-04-24 06:55:16

+0

@ code13解释一个?我解释了通过引用。阿米特的回答没有提供任何解释。此外,将每个位置存储在共享列表中的重要细节。如果你不这样做,它们将被垃圾收集,不能被其他代码使用。 OP显然是一个初学者,所以我不认为给他工作代码是多么有用,并说“这样做!”没有提供解释。 – KyleM 2013-04-24 06:57:13

2

A Person是对对象的引用。当您将它传递给方法像add()put()你给它引用的副本(通常是32位甚至64位JVM)

这意味着您的收藏可以拥有的“冗余”副本相同的参考,但鉴于你想在多个地方参考,我没有看到解决这个问题的方法。