android Integer类的toString函数的使用
今天,簡單講講android里如何使用Integer類的toString函數。
這個其實很簡單,就是將整數轉成字符串。不過之前一直使用的是String.value()來進行轉換的。后來在為網上查找資料,發現Integer類的toString函數的效率更高,所以在這里記錄一下。
一.下面介紹一下Integer類----toString函數的作用
toString方法---- 生成整數的十進制字符串 返回一個表示制定整數的String對象,將該參數轉換為有符號的十進制表形式,以字符串形式返回它,就好像將參數和基數10作為參數賦予toString(int,int),方法。
方法聲明1
Public static String toSring(int i);入口參數:i為表示要轉換成字符串的整數;
返回值:十進制(基數10)參數的字符串表示形式,
二.String.valueOf(int i)方法和Integer.toString(int i)方法的效率比較
1、String.valueOf(int i)
?2、Integer.toString(int?i)
?3、i+"";???? //i 為 int類型
?
三種方法效率排序為:
Integer.toString(int?i)?? >?? String.valueOf(int i)?? >? i+"";????
代碼測試:
public static void main(String[] args) { int[] intArr = new int[1000000];String[] strArr1 = new String[1000000];//為了公平分別定義三個數組String[] strArr2 = new String[1000000];String[] strArr3 = new String[1000000];//賦值Long t1 = System.currentTimeMillis();for(int i=0;i<1000000;i++){intArr[i]=i+1;}Long t2 = System.currentTimeMillis();for(int i=0;i<1000000;i++){strArr1[i] = String.valueOf(intArr[i]); }Long t3 = System.currentTimeMillis();for(int i=0;i<1000000;i++){strArr2[i] = Integer.toString(intArr[i]);}Long t4 = System.currentTimeMillis();for(int i=0;i<1000000;i++){strArr3[i] = intArr[i]+"";}Long t5 = System.currentTimeMillis();System.out.println("t1 = "+t1);System.out.println("t2 = "+t2);System.out.println("t3 = "+t3);System.out.println("t4 = "+t4);System.out.println("t5 = "+t5);System.out.println("賦值:"+(t2-t1));System.out.println("String.valueOf(i):"+(t3-t2));System.out.println("Integer.toString(i):"+(t4-t3));System.out.println("i+/"/":"+(t5-t4)); }我的測試結果為:
t1 = 1298798872078
t2 = 1298798872093
t3 = 1298798872656
t4 = 1298798873000
t5 = 1298798873671
賦值:15
String.valueOf(i):563
Integer.toString(i):344
i+"":671
簡單講講,大家可以會想知道為什么Integer.toString(int i)方法比String.valueOf(int i)方法效率高。可以看看android的源碼:
3.從源碼理解Integer類的toString方法
下面就深入看看Integer類的toString方法是如何實現的。還是直接上源碼。
public String toString() {return toString(value);}//------------------------------public static String toString(int i) {if (i == Integer.MIN_VALUE)return "-2147483648";//如果是最小值直接返回其字符串因為Integer.MIN_VALUE=-2147483648 ,這樣可以節省下面計算時間//①int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);//獲取整數值的長度10進制char[] buf = new char[size];//②getChars(i, size, buf);//得到整數中的每一個字符//③return new String(buf, true);//返回字符串值}上面的代碼做幾點說明:
①如果Integer的value值正好是 Integer.MIN_VALUE 直接返回 “-2147483648” 節省時間。
②得到integer值的十進制的長度,如果負數先求出絕對值的長度,然后再長度加1,因為負數的符號位占一位。
③得到integer的value值的每一個字符。
④得到的字符新建字符串返回。
下面看看 stringSize方法是怎樣實現的:
上面的 stringSize 非常的巧妙的來整數的長度,首先定義了一個數組這個數組中分別存放了一位十進制的最大值,二位十進制的最大值,依次到 Integer.MAX_VALUE為止,因為integer的最大值為 Integer.MAX_VALUE,也就是說integer的最大長度為10位。注意:
①stringSize(int x) 中的參數x 必須是正整數。
下面用一個實例看看stringSize(int x)方法。
上面的199小于999所以位數為3,而 out_max的值因為超過了 Integer.MAX_VALUE是個負數,得到的長度為1,因此求負數的長度時必須將其轉化為正數來求,而且求出的長度還要加上一位來放‘ - ’。得到integer的value值的長度后使用 getChars 方法來得到value的每一位上的字符。下面看看這個getChars方法。
static void getChars(int i, int index, char[] buf) {int q, r;int charPos = index;char sign = 0;if (i < 0) {sign = '-';i = -i;}// 當i >= 65536的時候每一次獲取兩位的char值。while (i >= 65536) {q = i / 100;// really: r = i - (q * 100);r = i - ((q << 6) + (q << 5) + (q << 2));//使用移位操作快速計算出q*100,2^6+2^5+2^2=64+32+4=100.i = q;buf [--charPos] = DigitOnes[r];buf [--charPos] = DigitTens[r];}// 當 i <= 65536的時候每次只獲取一位的char值// assert(i <= 65536, i);for (;;) {q = (i * 52429) >>> (16+3);//q/10,2^19=524288, (double)52429/(1<<19)=0.10000038146972656r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...buf [--charPos] = digits [r];i = q;if (i == 0) break;}if (sign != 0) {buf [--charPos] = sign;//如果是負數加上符號位}} //-------------------------------------- final static char [] DigitOnes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9','0', '1', '2', '3', '4', '5', '6', '7', '8', '9',} ;//-------------------------------------- final static char [] DigitTens = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0','1', '1', '1', '1', '1', '1', '1', '1', '1', '1','2', '2', '2', '2', '2', '2', '2', '2', '2', '2','3', '3', '3', '3', '3', '3', '3', '3', '3', '3','4', '4', '4', '4', '4', '4', '4', '4', '4', '4','5', '5', '5', '5', '5', '5', '5', '5', '5', '5','6', '6', '6', '6', '6', '6', '6', '6', '6', '6','7', '7', '7', '7', '7', '7', '7', '7', '7', '7','8', '8', '8', '8', '8', '8', '8', '8', '8', '8','9', '9', '9', '9', '9', '9', '9', '9', '9', '9',} ;getChars方法也是十分的巧妙
①在 i >= 65536 的時候每次能夠求出2位的char 值,求2位的char值時利用了兩個數組 DigitOnes 和 DigitTens 就是在這兩個數組的幫助下才能一次求出2位的char值下面就簡單的說一下怎樣利用這兩個數組來分別求出個位和十位上的值的,假如現在得到兩位數是 65,個位上是 5 要得到個位上的5,這時候不管十位是多少個位上一定是5,所以數組DigitOnes的 05,15,25,35,45,55,65,75,85,95位置上都是 5,這樣不管是25,還是35 都能得到個位上的5。在來看看如何得到十位上的數,還是65,十位是6,所以DigitTens 的60,61,62,63,64,……69 位置上都是6。
② q = (i * 52429) >>> (16+3);這段代碼其實就是q=i/10 ,其中 (double)52429/(1<<19)=0.10000038146972656也就是在int型的時候計算一個數的十分之1的精度是夠的,可以看出jdk開發者的這種優化意識是非常強的。
③(q << 6) + (q << 5) + (q << 2) 這段等價于q*100,因為 q*2^6+q*2^5+q*2^2=q*(64+32+4)=100q.這里為什么不直接使用q*100,而要使用位移操作,因為其實q*100底層還是要進行位移操作的,直接使用位移操作效率更高,這也給我們編程帶來啟示。能夠優化的時候一定要優化。
簡單講講,當傳入整數是Integer.MIN_VALUE,直接返回字符串“-2147483648”。其他整數時,先調用stringSize(int x)獲取整數的長度,這里主要一點,負數的長度會加1.(因為負號)然后新建一個char[] 數組,調用getChars(i, size, buf);將整數轉成字符數組,具體怎么轉換,代碼里很清楚。最后調用new String(buf, true);將字符數組變成String返回到調用代碼。
android Integer類的toString函數的使用就講完了。
就這么簡單
總結
以上是生活随笔為你收集整理的android Integer类的toString函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android removeRule的使
- 下一篇: android 如何使用服务器进行版本更