[英]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.