Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?
在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开发手册》中,也有对包装类对象比较的说明,内容如下:
- 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于integer var = ? 在-128至127范围内的赋值,integer对象是在integercache.cache产生,会复用已有对象,这个区间内的integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
推荐阅读
1.springcloud系列-整合hystrix的两种方式)
2.springcloud系列-利用feign实现声明式服务调用)
3.手把手带你利用ribbon实现客户端的负载均》
4.springcloud搭建注册中心与服务注册
5.spring boot配置过滤器的两种方式!
限时领取免费java相关资料,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo/kafka、hadoop、hbase、flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:
上一篇: 文艺复兴cosplay
下一篇: 发生在银行的笑话 笑死人了