web-dev-qa-db-ja.com

クラスオブジェクトとハッシュマップ

オブジェクトクラスを使用する代わりにハッシュマップを使用するのは良いことですか......ハッシュマップを使用しています..。

Map<String, String> cellMap = new HashMap<String, String>();
int j = 0;
while (cellIter.hasNext()) 
{
   HSSFCell myCell = (HSSFCell) cellIter.next();
   cellMap.put(columnMap[j], myCell.toString());
   j++;
}

そして、オブジェクトクラスを使用しています...。

ABC abc= new ABC(); 
abc.setA(myRow.getCell(0).toString());
abc.setB(myRow.getCell(1).toString());
abc.setC(myRow.getCell(2).toString());

アプリケーションの状態、メモリ要件などのコンテキストで教えてください...

25
abhi

これは、達成しようとしていることに大きく依存します。柔軟性のために、ハッシュマップの方が優れています。ただし、柔軟性には代償が伴います。ハッシュマップは、同じ数の強く型付けされたフィールドを持つクラスよりも大きく、低速です。

  • ハッシュマップは、同じ数のフィールドを持つクラスよりもメモリフットプリントが大きくなります
  • ハッシュマップはプリミティブにボクシングを強制します
  • ハッシュマップの作成とアクセスに時間がかかります

読みやすさにも影響があります。ビジネスロジックが固定数のフィールドを持つクラスに固有である場合、特別な目的のクラスが明らかに優先されます。フィールドが動的に構成されている場合、ハッシュテーブルが唯一のオプションです。オブジェクトが内部のストレージにハッシュマップを使用し、外部に適切な名前のフィールドを提示し、セマンティクスを公開して「フィールド」を追加するハイブリッド設計を使用することもできます。

要約すると、その柔軟性のためにハッシュマップを使用することを決定する前に、設計にそのすべての柔軟性が本当に必要かどうかを決定する必要があります。答えが「はい」の場合もあれば、「いいえ」の場合もあります。これに対する「1つのサイズですべてに対応する」ソリューションはありません。

34
dasblinkenlight

オブジェクトには、フィールド(データ)とメソッド(動作)があります。データがセルの固定セット(A、B、C)で構成されている場合は、必ずオブジェクトを使用してください。

JavaはOOオブジェクトであり、OO設計、カプセル化などは、堅牢で保守可能で高速なプログラムの構築に役立ちます。

マップは、可変数のキーと値を関連付ける必要がある場合に役立ちます。ただし、これは単なるデータ構造であり、追加の動作をカプセル化することはできません。

たとえば、オブジェクトにgetAAndB()メソッドがあり、Bと連結されたAを返す場合があります。または、フィールドを変換またはクエリするメソッドがある場合があります。または、ABCインスタンスをそれらを利用する他のオブジェクトに渡すこともできます。明確に定義されたメソッドでオブジェクトABDを使用することは、Map<String, String>を使用するよりもはるかに簡単です。マップのキーは何ですか?それらの価値は何ですか?どこに文書化されていますか?キーを変更したい場合はどうなりますか?これらのキーが使用されているコード内のすべての場所をどのように検出しますか?

5
JB Nizet

これは、パフォーマンスの前に「設計」の問題と見なす必要があります。優れた設計を優先して、事前の時期尚早な最適化を行う必要はありません。したがって、質問は次のとおりです。「ドメインオブジェクトABCにデータを入力するために中間コレクションを通過する必要がありますか?」ほとんどの場合、私はそれを行いませんが、決定的なものとは言い難いですはいまたは決定的ないいえより大きなコンテキストを知らなくても。

PDATE: 30-40K:レコード数は、ループで処理されるため、オブジェクトとHashMapの比較には関係ありません(免責事項:パフォーマンスではなく設計の観点からは関係ありません)。ただし、スプレッドシートの列数は、オブジェクトの属性数として直接反映されるため、重要です。

これがデータ移行またはデータ転送の演習である場合は、HashMapアプローチを使用します。 ABCが動作のない、短命で使い捨てのデータコンテナオブジェクトであると仮定すると、それを作成する必要はありません。次に、システムのパフォーマンスをテストし、受け入れ基準を満たしていない場合は、プロファイルを作成し、必要な場合にのみ最適化します。

4
Ushox