30

オブジェクトクラスを使うのではなく、hashmap を使った方がいいのでしょうか…… Hashmap を使うと……

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());

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

4

3 に答える 3

40

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

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

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

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

于 2012-04-21T10:30:33.357 に答える
6

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

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

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

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

于 2012-04-21T10:31:15.690 に答える
4

これは、パフォーマンスの前に「設計」の問題と見なす必要があります。優れた設計のために、事前に時期尚早の最適化を行う必要はありません。質問は、「ドメイン オブジェクト ABC を設定するために中間コレクションを経由する必要があるか?」ということです。ほとんどの場合、私はそれをしませんが、より大きな文脈を知らずに決定的なイエスまたは決定的なノーと言うのは難しいです.

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

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

于 2012-04-21T10:29:52.820 に答える