String轉Integer原始碼分析

2021-08-30 20:31:50 字數 2712 閱讀 9486

今天參加了開發類的面試,面試官問了我乙個問題,給你乙個string ,讓你轉換為int。我說用parseint()方法進行轉化,沒想到他說不要用這個現成的方法,我當時還真沒想到。回來上網查了一下,看了parseint()的源** ,豁然開朗!這就是差距啊!

下面是從網上找來的:

我們經常為用到integer.valueof(string str)這個方法,如果字串格式不對,這個方法會丟擲乙個系統異常numberformatexception

這裡我們就要分析一下這個方法,其中byte,short也是呼叫了ingeter中的方法.

在integer類中的定義如下:

public static integer valueof(string s) throws numberformatexception

這裡因為parseint方法返回的int型的,這裡呼叫了乙個建構函式產生了乙個新的integer例項.

這裡關心的是parseint方法,該方法**如下:

public static int parseint(string s, int radix)

throws numberformatexception

if (radix < character.min_radix)

if (radix > character.max_radix)

int result = 0;

boolean negative = false;

int i = 0, max = s.length();

int limit;

int multmin;

int digit;

if (max > 0) else

if (i < max) else

}while (i < max)

if (result < multmin)

result *= radix;

if (result < limit + digit)

result -= digit;

}} else

if (negative) else

} else

}很顯然,該方法的第二個引數表示是基數(最常用的是十進位制,還有十六機制,八進位制等等).

如果字串是空指標,直接丟擲異常.

如果基礎小於2或者大於36的話,丟擲異常(這種情況一般不會出現,因為我們用的最多就是十進位制的了).

如果是空字串,也丟擲異常,也就是max=0的情況了.

我們來關注下面的轉換過程:

這裡使用了character中的靜態方法digit,這個方法比較複雜,這裡先說明它的功能:對於給定的基數,如果是合法的字元(可以轉化為數字),返回該數字值,否則返回-1.比如digit('3',10)返回3,digit('a',10)返回-1.

這段程式看起來很簡單,其實還真不容易看懂,這裡先說明幾個區域性變數的含義吧:

result:記錄返回值

negative:符號標誌

i:字串位置

s:字串長度

limit:界限

multmin:也是乙個界限

digit:當前字元表示的數字

先看第乙個字元是否是'-'號,設定符號標誌negative和極限值limit.

注意到limit一定是乙個負值.

處理最高位,這裡result儲存的是負值,這樣就可以對正負數統一處理.

關鍵就是這個while迴圈了,第乙個if不用解釋了,肯定是因為非法字元.

第二個if語句的含義:如果result小於multmin,會產生什麼結果呢?

是不是一定會溢位呢?假設不會溢位,就是說結果必須》=limit.

result小於multmin,result至少應該位multmin-1,後面有result=result*radix=(multmin-1)*radix=multmin*radix-radix

該值肯定小於limit,其中multmin=limit/radix,注意這裡都是負數.

所以假設不成裡,如果result小於multmin的話,後面一定會溢位.

如果這裡沒有判斷的話,溢位就麻煩了,正數也會變負數了.

第三個if語句的含義:在這條語句以前肯定沒有溢位,但是有可能加上最後一位digit就溢位了,所以這個判斷也是必要的.

後面的就比較好理解了,else是表示空字串"".

如果是負數的還要看是否長度是1,就只是乙個'-'號的情況.

如果是正數的話返 回相反數就可以了.

這裡有好多地方都有可能丟擲異常,只要看明白了程式就知道這個異常是那條語句丟擲的了,這裡考慮溢位異常:異常1和異常2.

ingeter.max_value=2147483647

下面的兩條語句在不同的地方丟擲異常.

ingeter.valueof("2147483648");這個在異常2丟擲的.

ingeter.valueof("21474836471");這個在異常1丟擲的.

這裡簡單的分析了string轉化為ingeter的過程,其實整個ingeter類也就主要是這個方法了,byte和short都是呼叫這個方法的.

看看byte的**:

public static byte parsebyte(string s, int radix)

throws numberformatexception

了解這個方法後就再也不會為integer.valueof()產生的異常感到意外了,特別是在jsp中,因為引數都是string型的,轉換的時候動不動就出現異常,你該知道怎麼回事了吧.

Integer轉string 字串陣列

b 方式一 庫的字串輸入輸出流方式,寫入int值,之後呼叫輸出流物件的str方法來轉成string。b 優點是對轉換可以做一些格式化。int i 10 ostringstream oss oss i string s oss.str b 方式二 利用庫的itoa轉換成字串陣列,之後再使用string...

String和Integer的特例

string和integer兩個類是final類因此當記憶體中有要指向的物件時就不會建立 jdk 1.5後有了自動裝箱功能,因此可以直接string a 12 integer b 4 public static void main string args 執行效果為 true false true ...

String與Integer相互轉換

方法一 integer類的靜態方法tostring integer a 2 string str integer.tostring a 方法二 integer類的成員方法tostring integer a 2 string str a.tostring 方法三 string類的靜態方法valueo...