Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?

点击上方“Java碎碎念”,关注公众号

优质文章,第一时间送达

在Java的Integer类中,有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型,他们到底有什么区别呢?今天就来分析下。

本文目录

一、源码分析二、结论三、扩展

一、源码分析

Integer.parseInt(String s)的源码:

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

Integer.valueOf(String s)的源码:

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

从源码可以看到:

Integer.parseInt(String s)将会返回int常量。

Integer.valueOf(String s)将会返回Integer类型的对象。

Integer.valueof() 和 Integer.parseInt() 的底层都用到了Integer.parseInt(String s ,int radix)这个方法,这个方法将字符串作为有符号的十进制整数进行解析,并返回一个int类型的值。

而Integer.valueOf(String s)中又调用了public static Integer valueOf(int i) ,通过下面源码可以看到当int数值在-128和127之间的时候,会直接从cache中获取一个已存在Integer对象,但是不在这个范围内的数字,则会调用new Integer(i) 创建一个新对象。

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

二、结论

如果需要原始的int数据类型,则使用Integer.parseInt()方法。

如果需要包装类对象,则使用valueOf()方法。

同样Integer、Long、Double和Float都是一样的道理。

三、扩展

关于IntegerCache,在-127~128之间的值都会被cache,所以当我们需要的值位于这个区间时返回的都是同一个实例,具体可以参考下面代码:

//true,会用到缓存
System.out.println(Integer.valueOf(3) == Integer.valueOf(3));

//false,不会用到缓存
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));

//true,equals比较的值,返回true
System.out.println(Integer.valueOf(3).equals(Integer.valueOf(3)));

//true,equals比较的值,返回true
System.out.println(Integer.valueOf(500).equals(Integer.valueOf(500)));

在《阿里巴巴Java开发手册》中,也有对包装类对象比较的说明,内容如下:

  1. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

推荐阅读


限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。

640?wx_fmt=jpeg
Java碎碎念公众号

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值