web-dev-qa-db-ja.com

Java HashMap対JSONObject

Java HashMap対JSONObjectのパフォーマンスについて疑問に思っています。

JSONObjectはHashMapを使用して内部的にデータを格納しているようです。ただし、JSONObjectはHashMapと比較して追加のオーバーヘッドがある場合があります。

HashMapと比較したJava JSONObjectのパフォーマンスについて誰か知っていますか?

ありがとう!

35
user414585

あなたが言ったように、JSONObjectHashMapに支えられています。

このため、パフォーマンスはほぼ同じになります。 JSONObject.get()はnullチェックを追加し、キーが見つからない場合は例外をスローします。 JSONObject.put()map.put()を呼び出すだけです。

したがって、オーバーヘッドはほとんどありません。 JSONオブジェクトを処理する場合は、alwaysJSONObjectよりもHashMapを使用する必要があります。

44
jjnguy

質問はいくつかの理由で意味をなさないと思います:

  1. リンゴとオレンジの比較:HashMapとJSONObjectは2つのまったく異なる目的で使用されます。 「PersonクラスまたはCompanyクラスは、PhoneNumberオブジェクトを格納するのにより効率的ですか」と尋ねるようなものです。意味のあるものを使用してください。
  2. JSONとの間で変換を行っている場合、データを遠く離れた場所(ユーザーのブラウザーなど)に送信している可能性があります。このデータをネットワーク経由で送信し、ユーザーのブラウザーで評価するのにかかる時間は、(おそらく)EclipseでHashmapまたはJSONObjectにデータを入力することによるパフォーマンスの違いになります。
  3. そこには、1つ以上の「JSONObject」実装が浮かんでいます。
  4. 最後に、測定したいパフォーマンスの種類について質問していません。これらのクラスで実際に何をするつもりですか?
7
z5h

既存の答えは正しいですが、2つのパフォーマンスの違いはごくわずかです。

どちらも基本的に、データを保存および操作するためのかなり非効率的な方法です。より効率的な方法は通常、通常のJavaオブジェクトにバインドすることです。これにより、メモリ使用量が少なく、アクセスが高速になります。多くの開発者は、よく知られているorg.jsonのシンプルな(プリミティブ)ライブラリを使用します。 JacksonやGsonなどの選択肢は大幅に改善されているため、それらの使用を検討する価値があります。

4
StaxMan

JSONObjectには、HashMapに加えて追加のオーバーヘッドがあまりありません。 HashMapの使用に問題がない場合は、JSONObjectを使用しても問題ありません。これは、JSONを生成したい場合に提供されます。

JSONObjectは、JSONObjectの一部として格納している値の有効性をチェックし、JSON仕様に準拠していることを確認します。たとえばNaN値は、有効なJSONの一部を形成しません。これとは別に、JSONObjectはjson文字列を生成できます(通常の|事前定義済み)。これらの文字列は、JSONの量によってはかなり大きくなる可能性があります。また、JSONObjectはStringBufferを使用するので、私が行う多くのことの1つは、出現するすべてのStringBufferをStringBuilderに置き換えることです。

JSONObject(org.jsonから)は、使用できる単純なJSONライブラリの1つです。非常に効率的なものが必要な場合は、ジャクソンなどを使用してください。

1
Rahul

パフォーマンスのオーバーヘッドは、データのキャストのみです。 JSONObjectはオブジェクトのHashMapにデータを格納し、必要なデータ型をキャストします。

0
Amir Fo