欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-31 12:50:07
在Java的Integer类中,有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型,他们到底有什么区别呢?今天就来分析下。 本文目录 一、源码分析二、结论三、扩展 一、源码分析 Integer.pars ......

在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方法进行判断。

推荐阅读
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等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:

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