Integer.parseInt(s) 和 Integer.valueOf(s)详细区别(转)

今天在看jdk的源代码的时候注意到Integer.parseInt(s) 和 Integer.valueOf(s)的具体代码的实现有所区别:
Java代码

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


public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}


Java代码

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

public static Integer valueOf(String s) throws NumberFormatException
{
return new Integer(parseInt(s, 10));
}


注意到返回值型明显不同,但由于jdk1.5之后的自动装箱和拆箱,很多时候容易引起大家的混淆:
Java代码

1. public static void main(String[] args) {
2.
3. String a="400";
4. String b="400";
5. System.out.println(Integer.parseInt(a)==Integer.valueOf(b));//int和Integer比较,Integer自动拆箱
6. System.out.println(Integer.parseInt(a)==Integer.parseInt(b)); //两个基本类型比较自然没有问题。
7. System.out.println(Integer.valueOf(a)==Integer.valueOf(b)); //两个Integer对象比较,输出为false
8. }

public static void main(String[] args) {

String a="400";
String b="400";
System.out.println(Integer.parseInt(a)==Integer.valueOf(b));//int和Integer比较,Integer自动拆箱
System.out.println(Integer.parseInt(a)==Integer.parseInt(b)); //两个基本类型比较自然没有问题。
System.out.println(Integer.valueOf(a)==Integer.valueOf(b)); //两个Integer对象比较,输出为false
}


下面这段代码是浪曦的教程上的:
Java代码

1. Integer c=100;
2. Integer d=100;
3. Integer c1=200;
4. Integer d1=200;
5. System.out.println(c==d); //为true
6. System.out.println(c1==d1);//为false

Integer c=100;
Integer d=100;
Integer c1=200;
Integer d1=200;
System.out.println(c==d); //为true
System.out.println(c1==d1);//为false


教程的解释是:单字节(-128-127)的Integer比较是直接作为基本类型比较,否则是对象比较。我觉得这个说法比较牵强--虽然实践的结果是这样,等下将研究一下Autoboxing/Auto- Unboxing的具体实现代码看看(传闻是在编译中实现的,代码不好找,看看openjdk有没有);
---
专门去看了一下java语言规范,在5.1.7 Boxing Conversion上有清楚的说明:
引用
If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值