1

以下のケースを考えてみましょう

1) 以下に示すように、Location クラス (アプリで定義) のオブジェクトと、すべてのユーザー (アプリで定義) オブジェクトをコレクションとして保存する必要があります。

HashMap<Location, Collection<Person>>

そして、データは以下のように HashMap に保存されます (オブジェクトとして、説明のために名前を挙げています)

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

上記の例では、User1、User2、および User3 のハッシュマップ冗長コピーが各ロケーション内に格納されています。コレクション内の1対多の関係のデータを保存するこの正しい方法は?

4

5 に答える 5

4

「冗長性」はありません。すべてのハッシュマップ ストアは、同じオブジェクトへの参照です。

于 2013-04-24T06:39:06.950 に答える
2

APersonはオブジェクトへの参照です。のようなメソッドに渡すとき、add()またはput()参照のコピーを渡すとき(通常、64ビットJVMでも32ビットです)

これは、コレクションが同じ参照の「冗長な」コピーを持つことができることを意味しますが、複数の場所でその参照が必要な場合、これを回避する方法はわかりません。

于 2013-04-24T06:52:00.533 に答える
2

Person1 に含まれる情報は、そのオブジェクトのコピーを明示的に作成する何かを行わない限り (たとえば、実装されている場合は clone() メソッドを使用して)、一度だけ保存されます。

通常、 person1 のようなオブジェクトを複数のコレクションに追加しても、まったく新しいオブジェクトが最初のオブジェクトと同じになり、コレクションに入れられるべきではありません。何が起こっているかというと、異なるコレクションに保存されている人物オブジェクトへの参照が複数あるということです。各参照は、新しいオブジェクト全体のサイズに比べて非常に小さく、同じオブジェクトに対して複数の参照がある場合でも、その Person オブジェクトによって管理される情報 (名前、電子メールなど) は 1 回だけ保存されます。

したがって、コレクションで行っていることは問題ありません。オブジェクトの複数のコピーは作成されません。

(Java にはポインターはありませんが、ポインターを許可する言語を学習したことがある場合、複数の小さなポインターが 1 つの大きなオブジェクトを指すことができるという点で、考え方は似ています)

于 2013-04-24T06:48:50.933 に答える
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);
    }
}

アミットの答えと同じで、 aSet<User>をあなたのLocation. 次に、追加で を使用しArrayList<Location>てすべてのLocations. Arjun が指摘したように、冗長性はありません (重複したユーザー オブジェクト)。冗長性がなくなるのはいつですか?各Userオブジェクトが一度だけ作成され、複数のコレクションに追加される場合。これは、への参照Userが実際にコレクションに格納されているためです。これが、Java で「参照を値で渡す」という意味です。たとえば、List の add メソッドで呼び出すことができますadd(User)が、Java がバックグラウンドで行うことは、Userリストに異議を唱えます。したがって、リストは実際にはユーザー オブジェクトを直接保存しませんが、メモリ内のどこかに配置されます。

于 2013-04-24T06:49:08.553 に答える
0

必要はありません。要件に完全に適合するため、クラスにHashMap含めることができます。UserLocation

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 に答える