關於Integer.parseInt()方法的使用
解析Integer.parseInt()方法
我看到這個知識點是java面試基礎中的考點,所以自己為瞭以後面試打算自己過一遍。
我看到別人博客上對源碼直接是文字說明,我覺得效果不是很好,我這裡直接代數測試這個源碼運行流程。
1.我帶入一個正正整數 256 註意看註釋中的數值
public static int parseInt(String s, int radix) { /* * WARNING: This method may be invoked early during VM initialization * before IntegerCache is initialized. Care must be taken to not use * the valueOf method. */ //判斷基數是否在 2~36之間 if (s == null) { throw new NumberFormatException("null"); } if (radix < Character.MIN_RADIX) { throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX"); } if (radix > Character.MAX_RADIX) { throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX"); } int result = 0; boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; //-2147483647 int multmin; int digit; //字符串中的是否有符號 if (len > 0) { char firstChar = s.charAt(0); if (firstChar < '0') { // Possible leading "+" or "-" if (firstChar == '-') { negative = true; limit = Integer.MIN_VALUE; } else if (firstChar != '+') throw NumberFormatException.forInputString(s); if (len == 1) // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); i++; } //計算multmin 值 multmin = limit / radix; // multmin = -214748364 //開始循環 while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE //獲取字符轉換成對應進制的整數 digit = Character.digit(s.charAt(i++),radix); //第一次循環 digit = 2; //第二次循環 digit = 5; //第三次循環 digit = 6; if (digit < 0) { throw NumberFormatException.forInputString(s); } if (result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; //第一次循環 result = 0; //第二次循環 result = -20; //第三次循環 result = -250; if (result < limit + digit) { //第一次循環 limit + digit = -2147483645; //第二次循環 limit + digit = -2147483640; //第三次循環 limit + digit = -2147483634; throw NumberFormatException.forInputString(s); } result -= digit; //第一次循環 result = -2; //第二次循環 result = -25; //第三次循環 result = -256; } } else { throw NumberFormatException.forInputString(s); } return negative ? result : -result; //negative 值為false,所以 -result = -(-256) = 256 返回結果 }
2.我再帶入一個負數 -256
public static int parseInt(String s, int radix) { /* * WARNING: This method may be invoked early during VM initialization * before IntegerCache is initialized. Care must be taken to not use * the valueOf method. */ //判斷基數是否在 2~36之間 if (s == null) { throw new NumberFormatException("null"); } if (radix < Character.MIN_RADIX) { throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX"); } if (radix > Character.MAX_RADIX) { throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX"); } int result = 0; boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; //-2147483647 int multmin; int digit; //字符串中的是否有符號 if (len > 0) { char firstChar = s.charAt(0); if (firstChar < '0') { // Possible leading "+" or "-" if (firstChar == '-') { //走這裡 negative = true; limit = Integer.MIN_VALUE; //此時 limit = -2147483648; } else if (firstChar != '+') throw NumberFormatException.forInputString(s); if (len == 1) // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); i++; } //計算multmin 值 multmin = limit / radix; // multmin = -214748364 //開始循環 while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE //獲取字符轉換成對應進制的整數 digit = Character.digit(s.charAt(i++),radix); //第一次循環 digit = 2; //第二次循環 digit = 5; //第三次循環 digit = 6; if (digit < 0) { throw NumberFormatException.forInputString(s); } if (result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; //第一次循環 result = 0; //第二次循環 result = -20; //第三次循環 result = -250; if (result < limit + digit) { //第一次循環 limit + digit = -2147483646; //第二次循環 limit + digit = -2147483641; //第三次循環 limit + digit = -2147483635; throw NumberFormatException.forInputString(s); } result -= digit; //第一次循環 result = -2; //第二次循環 result = -25; //第三次循環 result = -256; } } else { throw NumberFormatException.forInputString(s); } return negative ? result : -result; //negative 值為true,所以 result = -256 = -256 返回結果 }
從以上代碼可以看出 multmin 和result 都為負值 這樣設計的原因我猜測是
Accumulating negatively avoids surprises near MAX_VALUE
(累加負值避免超過最大值 最小值:-2147483648 最大值:2147483647)
利用negative 這個標志變量,很巧妙的區分開瞭正負。
Integer.parseInt()到底有什麼用?
Integer.parseInt() 是Integer包裝類下的一個方法,作用是將()內的String類型字符串轉化為int類型
示例1
String str = "1234"; int x = Integer.parseInt(str); //x的值為1234
Integer.parseInt()方法中要求的是()內的字符串必須是是數字,但其第一個數字前可以帶 ‘-’ (負號)
示例2
String str = "-1234"; int x = Integer.parseInt(str); //x的值為-1234
補充:
如果str中含有部分非數字元素(除’-’),則會拋出錯誤
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 淺談JavaScript中的parseInt()的妙用
- Java實現統計字符串出現的次數
- java中應用Stack進行算術運算的操作
- C++實現LeetCode(8.字符串轉為整數)
- js中parseInt()詭異行為的探究與改正