1

考虑以下情况

1)我需要将 Location 类的对象(在我的应用程序中定义)与所有用户(在我的应用程序中定义)对象一起保存为集合,如下所示

HashMap<Location, Collection<Person>>

并且数据像下面一样存储在 HashMap 中(作为对象,我提到名称以进行解释)

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

现在在上面的示例中,在哈希图中,User1、User2 和 User3 的冗余副本存储在每个位置内。这是在集合中保存一对多关系数据的正确方法吗?

4

5 回答 5

4

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

于 2013-04-24T06:39:06.950 回答
2

APerson是对对象的引用。当您将它传递给类似的方法时,add()或者put()您正在给它一个引用的副本(即使在 64 位 JVM 上通常也是 32 位)

这意味着您的收藏可以具有相同参考的“冗余”副本,但鉴于您希望在多个地方提供该参考,我看不出有解决办法。

于 2013-04-24T06:52:00.533 回答
2

包含在 Person1 中的信息仅存储一次,除非您执行了明确复制该对象的操作(例如,通过使用 clone() 方法,如果已实现)

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

因此:您对集合所做的一切都很好,它不会创建对象的多个副本。

(java中没有指针,但如果你曾经研究过一种允许它们的语言,这个想法是相似的,因为多个较小的指针可以指向一个大对象)

于 2013-04-24T06:48:50.933 回答
0

There is no need of HashMap.You can have User contained in Location class as it suits your requirement perfectly.

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);
    }
}
于 2013-04-24T06:43:20.863 回答
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);
    }
}

与 Amit 的回答相同,只需将 aSet<User>与您的Location. 然后,您应该另外使用 anArrayList<Location>来存储您的所有Locations. 正如 Arjun 所指出的,没有冗余(重复的用户对象)。什么时候没有冗余?当每个UserObject 只创建一次,然后添加到多个 Collections 中。这是因为对 的引用实际上User存储在 Collection 中。这就是 Java 中“按值传递引用”的含义。例如,在 List 的 add 方法中,您可能会调用add(User),但 Java 在后台所做的是传递列表的引用(想想内存位置)的副本User反对列表。所以 List 实际上并不直接存储用户对象,但是,它位于内存中的某个地方。

于 2013-04-24T06:49:08.553 回答