2017-02-24 8 views
-2

を使用せずにJavaで実行時にメソッドを作成し、マップ内のオブジェクトの私は以下のようなオブジェクトのマップを持って反射

<key1, ClassAobj> 
<key2, ClassBobj> 
<key3, ClassCobj> 
<key4, ClassDobj> 

数は不明です。これらのオブジェクトのメソッドを繰り返し呼び出しています。

for key in keyset { 
    stringbuilder.append(map.get(key).getData()) 
} 

ですが、この繰り返しとstringbuilder.appendは大規模で、パフォーマンスに問題が発生します。つまり、時間がかかります。私は、のようなstribuilderを作成するランタイムメソッドを作成することを考えていた

getdata() { 

    return (stringbuilder(map.get(key1).getdata() + map.get(key2).getdata() + map.get(key3).getdata() + ... + till all entries in map))  

} 

それは正しいアプローチですか?例があれば、より良いアプローチがあればお勧めします。

私はJavaのリフレクションを試みましたが、それは現在のイテレータのバージョンよりずっと遅く、回避されました。

P.S.疑似コードとしてこれを考慮して構文を無視してください。

+2

実行時にメソッド全体を作成すると、sringbuilderより高速になると思いますか? – zack6849

+1

私は文字列ビルダーのパフォーマンスは、基本的な成長する文字配列だと思います。文字列ビルダーコンストラクターでは、予想される長さを指定する必要があります。 – Mordechai

+0

@MouseEventもう少し説明していただければ幸いです。 –

答えて

0

StringBuilder何が起こっているかを知っているので、文字列の連結を行うのに最も効率的な方法です。

内部的には、ビルダーには、すべての追加時に追加された値を格納する固定チャー・アレイがあります。アレイがいっぱいになるとどうなりますか? ArrayListと同様に、arr.length * 2の新しい配列が割り当てられ、値は新しい配列にコピーされます。このプロセスは、必要に応じて繰り返されます。

JavaDocのデフォルトの長さは16です。結果の文字列のおおよその長さを知っている場合は、その長さをコンストラクタに指定する方がよいでしょう。その後、余分なオーバーヘッドが減少します。

関連する問題