2017-08-22 7 views
2

バッファの現在の容量を取得するためにStringbufferで作業していましたが、非常に奇妙な動作が見つかりました。JavaとAndroidのStringBufferクラスの動作が異なります

私はJavaとAndroidの両方で以下のコードを実行しています。その電流容量から文字の数が増加するが、それは(oldcapacity * 2)+2によって容量を増加させる場合、私は増加バッファ容量

この式を発見し、多くのリソースによる

。たとえば、現在の容量が16の場合、(16 * 2)+ 2 = 34になります。

StringBuffer sb = new StringBuffer(); 
    System.out.println(sb.capacity()); 
    sb.append("Hello Hello Hello Hello"); 
    System.out.println(sb.capacity()); 
    System.out.println(sb.length()); 

のJava output--

default capacity = 16 
increases capacity = 34 
length = 23 

アンドロイドoutput--

default capacity = 16 
increases capacity = 26 
length = 23 

誰もがこのことについて知っていれば、私はその後、私を助けてください、これを理解することはできません。

ありがとうございました。

+0

これについて「非常に奇妙な」とは何ですか?彼らは異なるデフォルト値を使用します... –

+0

**彼らは異なるデフォルト値**を使用しますか? JavaとAndroidの両方でデフォルト値は異なります..? –

答えて

5

StringBufferの容量が増える方法は、内部実装の詳細です。 APIを使用すると、コードでパフォーマンス関連の決定を行うための容量を見ることができます。このクラスのドキュメント/契約は、容量がどのように自動的に増加するかを正確に保証しません。したがって、それらは異なるプラットフォームで異なることが許されます。どちらのプラットフォームでも同じでなければならないのは、文字列の長さがStringBufferであることです。

ところで、複数のスレッドで同じStringBufferオブジェクトを使用していない場合は、代わりにStringBuilderを使用してください。

+2

厳密に言えば、それは内部実装の詳細である能力そのものではありません。 'new StringBuffer(int capacity)'を使って設定することができます(API docはデフォルトでは16であると言っています)、ensureCapacity()があります。それは実装の詳細である自動容量の増加です。 – daniu

+0

@daniuあなたは絶対に正しいです。私はそれを修正しました。 – DodgyCodeException

+0

DodgyCodeExceptionは、この式**(oldcapacity * 2)+ 2 **はすべてのプラットフォームに該当しないことを意味しますか? –

3

StringBufferのクラス定義では、実装が容量をどれだけ増やすべきかについての要件は明示的には定義されていません。彼らは好きですが、実装方法は自由です。

モバイルデバイスでのメモリ制限がある場合、Androidを増やす必要があるときにバッファに割り当てる余分なスペースがあるため、Androidは自由ではないということは意味があります。

+0

ありがとうポールLeBeau .. –

関連する問題