この質問がこのフォーラムにとってあまりに基本的なものではないと思われればよいのですが、どうなるかはわかりません。何度も実行されるコードをリファクタリングしてパフォーマンスを向上させる方法を知りたいのです。
たとえば、マップ (おそらく HashMap) を使用して単語の頻度リストを作成するとします。ここで、各キーはカウントされる単語を含む文字列で、値は単語のトークンが見つかるたびに増加する整数です。
Perl では、このような値を増分するのは非常に簡単です。
$map{$word}++;
しかし、Java では、はるかに複雑です。現在私が行っている方法は次のとおりです。
int count = map.containsKey(word) ? map.get(word) : 0;
map.put(word, count + 1);
もちろん、これは新しい Java バージョンのオートボクシング機能に依存します。このような値を増分するより効率的な方法を提案していただけないでしょうか。Collections フレームワークを避けて代わりに何か他のものを使用することには、パフォーマンス上の理由があるのでしょうか?
更新: いくつかの回答をテストしました。以下を参照してください。
ベストアンサー1
Java 8ではより短い方法があります。Map::merge
。
myMap.merge(key, 1, Integer::sum)
または
myMap.merge(key, 1L, Long::sum)
それぞれ long の場合。
機能:
- キーが存在しない場合は、値として1を設定します
- それ以外の場合はキーにリンクされた値に1を加算する
詳しくはここ。