Integer.parseInt(String s, int radix)方法介绍(修正版)

本文详细解析了Java中Integer.parseInt()方法的工作原理及其内部实现机制,包括如何将不同进制的整数字符串转换为十进制整数,并讨论了方法参数的有效范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        先来说明一下Integer.parseInt(String s, int radix)的功能

        Integer.parseInt(String s, int radix)就是将整数字符串s(radix用来指明s是几进制)转换成10进制的整数,显然前提是s为整数字符串。比如 s可以为“1314520”、“5201314”等。不可以为“我爱你一生一世”或者“I love you  forever”等之类的非整数字符串。

       那么,Integer.pareseInt("10086",10)就是将10进制整数字符串“10086”转换成10进制的整数10086。(有些说法是为了便于表达)

       下面我们来了解一下它的具体的内部机制。

       jdk中 java.lang.Integer中的源码如下:

1、

  1. public static int parseInt(String s) throws NumberFormatException   
  2. {  
  3.     return parseInt(s,10);  
  4.  }  

2、

  1. public static int parseInt(String s, int radix)throws NumberFormatException  
  2.    {  
  3.        if (s == null) {  
  4.            throw new NumberFormatException("null");  
  5.        }  
  6.   
  7. if (radix < Character.MIN_RADIX) {          //Character.MIN_RADIX=2  
  8.     throw new NumberFormatException("radix " + radix +  
  9.                     " less than Character.MIN_RADIX");  
  10. }  
  11.   
  12. if (radix > Character.MAX_RADIX) {          //Character.MAN_RADIX=36  
  13.     throw new NumberFormatException("radix " + radix +  
  14.                     " greater than Character.MAX_RADIX");  
  15. }  
  16.   
  17. int result = 0;  
  18. boolean negative = false;  
  19. int i = 0, max = s.length();  
  20. int limit;  
  21. int multmin;  
  22. int digit;  
  23.   
  24. if (max > 0) {  
  25.     if (s.charAt(0) == '-') {  
  26.     negative = true;  
  27.     limit = Integer.MIN_VALUE;  
  28.     i++;  
  29.     } else {  
  30.     limit = -Integer.MAX_VALUE;  
  31.     }  
  32.     multmin = limit / radix;  
  33.     if (i < max) {  
  34.     digit = Character.digit(s.charAt(i++),radix);  
  35.     if (digit < 0) {  
  36.         throw NumberFormatException.forInputString(s);  
  37.     } else {  
  38.         result = -digit;  
  39.     }  
  40.     }  
  41.     while (i < max) {  
  42.     // Accumulating negatively avoids surprises near MAX_VALUE  
  43.     digit = Character.digit(s.charAt(i++),radix);  
  44.     if (digit < 0) {  
  45.         throw NumberFormatException.forInputString(s);  
  46.     }  
  47.     if (result < multmin) {  
  48.         throw NumberFormatException.forInputString(s);  
  49.     }  
  50.     result *= radix;  
  51.     if (result < limit + digit) {  
  52.         throw NumberFormatException.forInputString(s);  
  53.     }  
  54.     result -= digit;  
  55.     }  
  56. else {  
  57.     throw NumberFormatException.forInputString(s);  
  58. }  
  59. if (negative) {  
  60.     if (i > 1) {  
  61.     return result;  
  62.     } else {    /* Only got "-" */  
  63.     throw NumberFormatException.forInputString(s);  
  64.     }  
  65. else {  
  66.     return -result;  
  67. }  
  68.    }  


我们以Integer.parseInt("110",10)为例。内部的转换过程其实是这样的:
                   
            i=  1*10*10+1*10+0*1; 

若是   Integer.parseInt("111",2)呢?

显然么     i  = 1*2*2+1*2+1*1。为了便于理解,直接这样称呼它们吧: 10进制整数字符串“110”,2进制整数字符串“111”。这时候,还有个问题,就是可以写成Integer.parseInt(“119”, 2)吗?显然是不对滴!2进制数怎么可能出现9呢。如果这样写,系统会抛出java.lang.NumberFormatException异常。

细心的朋友会注意到,在函数内部有这样的约束条件:Character.MAX_RADIX >=  radix >= Character.MIN_RADIX 。                      
根据:Character.MIN_RADIX=2和Character.MAX_RADIX=36 则,parseInt(String s, int radix)参数中  
radix的范围是在2~36之间,超出范围会抛异常。其中s的长度也不能超出7,否则也会抛异常。  

<think>我们正在讨论Integer.parseInt(String)Integer.valueOf(String)的区别。根据引用内容,我们可以总结如下: 1. **返回值类型不同**: - `Integer.parseInt(String s)` 返回的是基本数据类型 `int`。 - `Integer.valueOf(String s)` 返回的是包装类 `Integer` 的对象。 2. **内部实现**: - `parseInt` 方法内部调用了 `parseInt(String s, int radix)`,默认使用十进制。 - `valueOf` 方法内部调用了 `parseInt` 方法得到 `int` 值,然后使用 `Integer.valueOf(int)` 将其转换为 `Integer` 对象。 3. **缓存机制**: - `Integer.valueOf(int)` 方法会使用缓存。对于范围在 -128 到 127 之间的整数,会返回缓存中的对象,而不是新建对象。但注意,这里说的是 `valueOf(int)` 的缓存,而 `valueOf(String)` 因为内部调用了 `parseInt` 得到 `int`,再调用 `valueOf(int)`,所以同样适用缓存。 4. **参数类型**: - `parseInt` 方法只能接受 `String` 类型参数。 - `valueOf` 方法可以接受多种类型参数(如 `byte`, `char`, `short`, `int`, `long` 等),但这里我们讨论的是字符串参数。 5. **自动拆箱**: - 由于 `valueOf` 返回的是 `Integer` 对象,但在需要 `int` 的上下文中(如赋值给 `int` 变量,算术运算等),会自动拆箱为 `int`。因此,在大多数情况下,两者可以互换使用,但要注意可能发生的自动拆箱带来的性能影响(微乎其微)以及空指针风险(如果返回的 `Integer` 对象为 `null`,但这种情况在转换字符串时不会出现,因为转换失败会抛出异常)。 6. **异常处理**: - 两者在转换失败时都会抛出 `NumberFormatException`。 7. **使用场景**: - 如果需要基本类型 `int`,使用 `parseInt` 更直接,避免创建对象(但实际上,在自动拆箱下,`valueOf` 也会被优化,且缓存机制可能减少对象创建)。 - 如果需要 `Integer` 对象(例如放入集合中),使用 `valueOf` 可以避免显式创建对象。 根据引用[4]和[5]: > Integer.parseInt()返回intInteger.valueOf()返回int的封装类Integer。 > 通常情况下,如果只需要使用整数的值而不需要Integer对象,建议使用Integer.parseInt(str)方法。如果需要将整数作为对象进行操作,则可以使用Integer.valueOf(str)。 因此,我们可以这样总结: - 如果你需要一个基本类型 `int`,那么使用 `parseInt` 更合适。 - 如果你需要一个 `Integer` 对象(例如要放入集合中,或者需要使用对象的方法),那么使用 `valueOf` 更合适。 另外,引用[3]提到: > 当参数类型为String时,Integer.ParseInt(String)返回intInteger.valueOf(String)返回Integer,无区别。 这里说的“无区别”是指功能上都可以将字符串转为整数,但返回类型不同。 同时,引用[3]还提到: > 由于Integer.valueOf()的参数可以为多种类型;①当参数为byte,char,short,string等自动转换为int类型时,会自动转换,当为float或double时会提示错误。②特殊的:当参数类型为char时,Integer.valueOf()会自动计算char类型的ASII码,如对于char ch=‘a’,使用Integer.valueOf(ch)输出97. 这里需要注意,我们讨论的是参数为字符串的情况。对于其他类型,`valueOf` 有重载方法。 现在,我们按照要求组织答案,包括数学公式(如果有的话,但本题不涉及复杂公式,所以可能不需要)和代码示例。 注意:在回答中,我们需要在引用内容的末尾添加引用标识,如[^1]。</think>### Java 中 `Integer.parseInt()` 与 `Integer.valueOf()` 的区别详解 #### 🔍 核心区别总结 | 特性 | `Integer.parseInt(String)` | `Integer.valueOf(String)` | |---------------------|----------------------------|---------------------------| | **返回值类型** | `int` (基本数据类型) | `Integer` (包装类对象) | | **内部实现** | 直接调用 `parseInt(s, 10)` | 调用 `parseInt()` 后包装为对象 | | **缓存机制** | ❌ 无缓存 | ✅ 使用整数缓存池 (-128~127) | | **参数兼容性** | 仅支持 `String` | 支持多种类型(包括 `char`) | | **内存开销** | 更低(无对象创建) | 更高(可能创建新对象) | | **推荐使用场景** | 需要基本类型计算的场景 | 需要对象操作的场景(如集合) | --- #### 💡 详细解析(含源码分析) 1. **返回值本质区别** ```java // parseInt 返回基本类型 int int num1 = Integer.parseInt("42"); // → 42 (基本类型) // valueOf 返回包装类 Integer Integer num2 = Integer.valueOf("42"); // → Integer@1234 (对象引用) ``` - **关键点**:`parseInt()` 直接返回 `int`,而 `valueOf()` 返回的是包装类对象([^4]) 2. **源码实现差异** ```java // parseInt 源码 (简化版) public static int parseInt(String s) { return parseInt(s, 10); // 直接返回 int } // valueOf 源码 (简化版) public static Integer valueOf(String s) { return Integer.valueOf(parseInt(s, 10)); // 调用 parseInt 后包装 } ``` - `valueOf()` 内部依赖 `parseInt()` 进行字符串转换([^4]) - 对于 `int` 值,`Integer.valueOf(int)` 会使用缓存池优化 3. **缓存机制对比** ```java Integer a = Integer.valueOf(127); Integer b = Integer.valueOf(127); System.out.println(a == b); // true (使用缓存池) Integer c = Integer.valueOf(128); Integer d = Integer.valueOf(128); System.out.println(c == d); // false (超出缓存范围) ``` - 缓存范围:**-128 到 127**(通过 `IntegerCache` 实现) - `parseInt()` 无此优化([^1]) 4. **参数兼容性差异** ```java // valueOf 支持多种类型 Integer ascii = Integer.valueOf('A'); // 65 (ASCII 值) // Integer.parse('A'); // 编译错误! // 处理浮点数需注意 Double.parseDouble("3.14"); // ✅ 正确方式 // Integer.valueOf(3.14); // ❌ 编译错误 ``` - `valueOf()` 可接受 `char` 类型并自动转换 ASCII([^3]) - 两者都无法直接处理浮点数字符串 --- #### ⚠️ 异常处理与最佳实践 1. **统一异常类型** ```java try { int num = Integer.parseInt("12a"); // 抛出 NumberFormatException } catch (NumberFormatException e) { System.out.println("无效数字格式"); } ``` - 两者对非法输入均抛出 `NumberFormatException` 2. **性能与内存建议** - 优先使用 `parseInt()` 的场景: ```java // 计算场景(避免自动拆箱开销) int sum = Integer.parseInt("100") + 50; ``` - 优先使用 `valueOf()` 的场景: ```java // 集合操作 List<Integer> list = new ArrayList<>(); list.add(Integer.valueOf("42")); ``` 3. **空值安全处理** ```java // 使用 Optional 避免 NPE String input = getInput(); int safeValue = Optional.ofNullable(input) .filter(s -> s.matches("\\d+")) .map(Integer::parseInt) .orElse(0); ``` --- #### 💎 终极选择指南 | 场景 | 推荐方法 | 原因 | |-------------------------------|------------------------|-------------------------------| | 数学运算/基本类型操作 | `Integer.parseInt()` | 避免自动拆箱开销 | | 集合存储/对象操作 | `Integer.valueOf()` | 直接获得对象类型 | | 高频使用小数字 (-128~127) | `Integer.valueOf()` | 利用缓存减少对象创建 | | 不确定输入是否有效 | 结合 `try-catch` | 统一处理 `NumberFormatException` | > **经验法则**:需要 `int` 用 `parseInt`,需要 `Integer` 用 `valueOf`([^5]) --- #### 示例场景对比 ```java // 场景1:简单计算(parseInt 更优) int total = Integer.parseInt("500") * 2; // 场景2:放入HashMap(valueOf 更优) Map<String, Integer> map = new HashMap<>(); map.put("count", Integer.valueOf("100")); // 场景3:缓存优化(valueOf 节省内存) List<Integer> smallNumbers = Arrays.asList( Integer.valueOf("100"), Integer.valueOf("100") // 复用缓存对象 ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值