2017-09-11 7 views
0

オブジェクトを格納するConcurrenthashmapを使用しています。私はそのオブジェクトを取得し、ハッシュマップを変更することなくそれを変更したい。どうすればいいのですか?私はHashMapのにEmployee型のオブジェクトを追加したハッシュマップの値を変更せずにハッシュマップからオブジェクトのコピーを取得する方法

ConcurrentHashMap<String,Employee> dataStorage = new 
ConcurrentHashMap<String,Employee>(10000); 
dataStorage.put("Employee1", Employee1); 

:後 は私のコードです。 私が行うとき、私はemployee1を変更する場合は今

Employee employee1 = dataStorage.get("Employee1"); 

を取得し、更新されたオブジェクトは、どのように私はHashMapに格納された値に影響を与えることなく、employee1を変更しないHashMap

に格納されますか?

+0

あなたのハッシュマップのタイプは何ですか?生の型の使用を避けるべきです。 – nullpointer

+6

'Employee'オブジェクトの深いコピーを作る必要があります。 – Kayaman

+1

これを達成する唯一の方法は、オブジェクトの_deep copy_を作成することです。つまり、同じ内部状態を持つ完全に新しいオブジェクトを作成することです。 「従業員」の定義を知らなければ、具体的にあなたを助けることはできません。一般に、コピーコンストラクタまたは 'clone'メソッドを使用します。 –

答えて

2

employeeオブジェクトのディープコピーを作成することができます。つまり、employeeオブジェクトのメモリ位置を渡すのではなく、実際に新しいオブジェクトを作成することができます。

詳細についてはdeep copyこちらをお読みください。

あなたはこのようなものを使用することによってそれを行うことができます。

/** 
    * This method makes a "deep clone" of any object it is given. 
    */ 
    public static Object deepClone(Object object) { 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(object); 
     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
     ObjectInputStream ois = new ObjectInputStream(bais); 
     return ois.readObject(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 
} 

をあなたはhereを読むことができ、よりについて。

また、clone()を使用すると、Cloneableを実装できます。

ここではclone()またはhereをお読みください。

+0

Cloneableインターフェイス(https://www.javatpoint.com/object-cloningなど)を単独で実装することでこれが達成できない理由と、なぜこの深いクローンが必要なのか教えてください。 – manu

+1

不十分な質問に「解決策」をあまりにも早く提供しないでください。私たちは、OPの文脈で「ディープコピー」のセマンティクスが何を意味するのか、つまりコピーがどれくらい深く必要であるかを全く知らない。あなたは1つ下の階層に進み、OPのデータ構造は深いところまで広がっています。 –

+0

@manuできます。私は2つの代替アプローチを行った。別の簡単なアプローチがTimによって与えられる。 –

0

Employeeオブジェクトのディープコピーを作成します。あなたはハッシュマップから直接取得Employeeオブジェクトにいくつかの変更を行う場合には、あなたが正しく観察されたように

class Employee { 
    private String name; 
    private int ID; 
    // other fields... 

    public Employee(Employee other) { 
     this.name = other.name; 
     this.ID = other.ID; 
     // ... 
    } 
} 

:ここでの一つの可能​​性はどの分野にわたるコピーしますEmployeeクラスにコピーコンストラクタを追加することですそこに「ついていく」。 Javaを使用している私の人生の中で、この動作は通常私が望むものでしたが、うまくいけば、この答えは考慮すべき1つの回避策です。私はこれが働くことを願っています

+0

あまり指定されていない質問に「解決策」をすばやく提供しないでください。私たちは、OPの文脈で「ディープコピー」のセマンティクスが何を意味するのか、つまりコピーがどれくらい深く必要であるかを全く知らない。あなたは1つ下の階層に進み、OPのデータ構造は深いところまで広がっています。 –

+0

@ジムガリソン私は従業員のクラスがあまり深くないと賭けるだろう。 SOの回答は各質問に合わせて調整する必要があります。 –

-1
ConcurrentHashMap<String,Employee> dataStorage = new 
ConcurrentHashMap<String,Employee>(10000); 
dataStorage.put("Employee1", Employee1.clone()); 

In most of the cases, the shallow copy should work. 
+0

このコードの内容を説明してください –

0
Employee Employee2 = Employee1.clone(); 
dataStorage.put("Employee1", Employee2); 

関連する問題