簡體   English   中英

Java-更好的模型來保存對象(集合)

[英]Java - Better model to save objects (Collection)

考慮以下情況

1)我需要將Location類(在我的應用程序中定義)的對象以及所有User(在我的應用程序中定義)對象保存為集合,如下所示

HashMap<Location, Collection<Person>>

數據像下面這樣存儲在HashMap中(作為對象,我提到名稱以供說明)

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

現在在上面的示例中,在哈希圖中,User1,User2和User3的冗余副本存儲在每個位置中。 將一對多關系的數據保存在集合中的這種正確方法嗎?

沒有“冗余”。 所有哈希表存儲都是對同一對象的引用。

Person1中包含的信息僅存儲一次,除非您執行了明確復制該對象的操作(例如,如果實現了,則使用clone()方法)。

通常,將諸如person1之類的對象添加到多個集合中,不應使一個全新的對象與第一個對象完全相同並將其放入集合中。 發生的事情是存在對保存在不同集合中的person對象的多個引用 與整個新對象的大小相比,每個引用都很小,盡管您可能對同一對象有多個引用,但是由該Person對象管理的信息(例如名稱,電子郵件等)僅存儲一次。

因此:您對集合所做的一切都很好,它不會創建對象的多個副本。

(Java中沒有指針,但是如果您曾經研究過一種允許使用它們的語言,則其思想相似,因為多個較小的指針可以指向一個大對象)

Person是對對象的引用。 當您將其傳遞給類似add()put()的方法時,您將為其提供引用的副本(即使在64位JVM上,通常也是32位的)

這意味着您的館藏可以具有相同參考的“冗余”副本,但是鑒於您希望在多個地方使用該參考,因此我看不到解決方法。

不需要HashMap 。您可以在Location類中包含User ,因為它完全適合您的要求。

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);
    }
}
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的答案相同,只是將Set<User>與您的Location關聯。 然后,您還應該使用ArrayList<Location>來存儲所有Locations 正如Arjun指出的那樣,沒有冗余(重復的用戶對象)。 什么時候沒有冗余? 當每個User對象僅創建一次,然后添加到多個集合中時。 這是因為對User引用實際上存儲在集合中。 這就是Java中“按值傳遞引用”的意思。 例如,在List的add方法中,您可以調用add(User)但是Java在后台執行的操作是將User Object的引用(認為內存位置)的副本傳遞給List。 因此,列表實際上並沒有直接存儲用戶對象,但是它位於內存中的某個位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM