2011-07-04 8 views
3

は、Android用に作成しているアプリのうち、intからStringに繰り返し変換する必要があると考えました。私は座って、私は今、私はあなたが原因関数が持つInteger.toString()、およびなどのようなコールを見ることができない変数を潜んでいるの割り当てを緩和するだろうと思う小さなユーティリティクラス...Android/Javaをint型からString型への変換なしで変換しますか?

private int[] iMods = { 
     1, 
     10, 
     100, 
     1000, 
     10000, 
     100000, 
     1000000, 
     10000000, 
     100000000, 
     1000000000}; 

private int tmpInt = 0; 
private int MAX_DIGITS = 6; 
private char[] cScoreDigit = new char[MAX_DIGITS]; 
private int[] iScoreDigit = new int[MAX_DIGITS]; 
private StringBuilder mScoreStringBuilder = new StringBuilder("000000"); 


public String intToString(final int pInt, final int pMAX_DIGITS){ 
    MAX_DIGITS = pMAX_DIGITS; 

    for (tmpInt = 1; tmpInt <= MAX_DIGITS; tmpInt++){ // Set each cScoreDigit to proper equivalent of iScoreDigit without cast! 
     switch ((pInt % iMods[tmpInt])/iMods[tmpInt - 1]){ 
     case 0: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '0'; 
      break; 
     case 1: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '1'; 
      break; 
     case 2: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '2'; 
      break; 
     case 3: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '3'; 
      break; 
     case 4: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '4'; 
      break; 
     case 5: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '5'; 
      break; 
     case 6: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '6'; 
      break; 
     case 7: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '7'; 
      break; 
     case 8: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '8'; 
      break; 
     case 9: 
      cScoreDigit[MAX_DIGITS - tmpInt] = '9'; 
     }  
    } 

    // Delete all 0's 
    mScoreStringBuilder.delete(0, mScoreStringBuilder.length()); 
    return mScoreStringBuilder.append(cScoreDigit).toString(); 
} 

を書きましたこれは実際にこのようなことを行う正しい方法であるかどうか、そしてB)各ステップで余分な数学が行われるため、このようなものを検討する価値があるのか​​どうか、A)については興味がありますか?カウンタの生産性は見えますが、GCが正しく動作するのを少なくとも抑制しますか?前もって感謝します!

[EDIT]

それは私の注意に持って来られていますStringBuilder.toStringは()実際に私は避けるようにしようとしていたものですされ、一時的なオブジェクトを割り当てるようにします。割り当てを持たずに単にchar []をStringに変換する他の方法はありますか?または、以下のように、これはStringクラスでは不可能ですか?

+0

intから直接 'char'値を計算できるので、スイッチ/ケースをリファクタリングすることができます。 *ヒント* - '' 0 ''のASCII値を調べる –

+0

それがもっと速いかどうか分かりませんか?または、文字の値(数値)を実際の整数桁から外した量だけ操作すると言っていますか?それはうまくいくようですね!しかし、以下に述べるように、これはまだ.toString()を使用しているため、割り当てたい.....ではなく、自分自身と対戦します。 –

答えて

2

いいえ、最後のtoStringは新しいStringを作成します(必要に応じてコードを確認してください。Javaライブラリソースはすべて利用可能です)。

文字列が不変なので、実際には文字列を返すため、割り当てを避ける方法はありません。

番号を作成するために使用していた文字列ビルダーを返して、次に呼び出されたときにそれを再利用した場合、文字列に変換されることはありませんでしたが、2番目の文字列はどのようにそれをやったのか)、あなたはメモリを割り当てています。あなたのメソッドは、渡された可変オブジェクト(のStringBuilderまたはchar配列)を受け入れなければならないのいずれか、またはそれが(それシングルスレッド作る)静的なものを再利用しなければならない。これを行うために

私はかつてこれを試してみましたが、ある時点ではすべての作業を元に戻し、明白な方法を使用していた場合よりもさらに遅くしています。

また、Javaの短期的なメモリ割り当ては、あなたが思うほど悪くないことを覚えておいてください。つまり、パフォーマンス面でCのスタック割り当てに似ています。

リサーチとテスト私が指摘したことは、ループ内で文字列を連結することを避けることです。他のすべてのもの(ワンタイム文字列の連結を含む)は、最も簡単なコードは来ることができる。

+0

K、何らかの理由で、サイクルでは、StringBuilderが再利用されます。しかし、あなたが言ったように、それはまだオブジェクトをtoString()に割り当てています。これを避ける方法は不明です。 –

関連する問題