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

Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?的更多相关文章
- Integer.parseInt()和Integer.valueOf()有什么区别
jdk的源代码的时候注意到Integer.parseInt(s) 和 Integer.valueOf(s)的具体代码的实现有所区别: Java代码 public static int parseInt ...
- Java 中的 int 与 Integer 用于 List<Integer> 时,以及通过打印变量检測程序执行和函数调用次数计数
总结一下近期做的东西中遇到的问题 1. Java 中的 int 与 Integer 用于 List<Integer> 时 两者之间的关系都是非常清楚的.int 是基本数据类型,存储的是值 ...
- Java中的int和Integer
代码: public class Test{ public static void main(String[] args){ Integer i01 = 59; int i02 = 59; Integ ...
- Integer.parseInt vs Integer.valueOf
一直搞不清楚这两个有什么区别.刚才特意查了一下帖子. Integer.parseInt 返回的是 primitive int Integer.valueOf 返回的是 Integer Object ...
- Integer.parseInt()和Integer.valueOf()方法详解
1.Integer.parseInt(): public static int parseInt(String s) throws NumberFormatException { return par ...
- Java中parse()和valueOf(),toString()的区别
1.parse()是SimpleDateFomat里面的方法,你说的应该是parseInt()或parsefloat()这种方法吧, 顾名思义 比如说parseInt()就是把String类型转化为i ...
- java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是
答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
- java Integer.valueOf 和 Integer.parseInt 和 new Integer区别及注意事项
先看一下下面的结果 1.System.out.println(127==127); //true , int type compare 2.System.out.println(128==128); ...
- Integer.parseInt(String s) 和 Integer.valueOf(String s) 的区别
通过查看java.lang.Integer的源码可以发现, 它们最终调用的都是 /** * Parses the string argument as a signed integer in the ...
随机推荐
- 实验吧CTF练习题---WEB---头有点大解析
实验吧web之头有点大 地址:http://www.shiyanbar.com/ctf/29 flag值:HTTpH34der 解题步骤: 1.进入解题界面,看提示 2.说提示很多,再提示 ...
- IOCAutofac与ORMEntityFramwork的联系--单例模式
在你阅读之前默认你已经理解了IOC.DI.ORM以及autofac和EF的使用 在我最近写项目的时候我在单步调试时偶然发现的一个问题 先说明我的项目使用.NET MVC 三层架构,运用IOC Auto ...
- Android开发必看知识
奇艺高清UI界面源代码 http://www.eoeandroid.com/thread-160824-1-1.html 搜索关键字飞入飞出效果 http://www.eoeandroid.com/t ...
- 一次写文,多平台直接粘贴&打造最流畅的写作流程
文字爱好者的痛点 这一段可以跳过,解决办法在后面.因为大家既然痛过,也就懂了. 对于很多文字爱好者来说,都希望写一篇文章后,可以实现多平台发布. 国内的很多平台都开始支持 Markdown,除了微信公 ...
- 微信小程序商城构建全栈应用 Thinkphp5
课程——微信小程序商城构建全栈应用[目录]第1章 前言:不同的时代,不同的Web第2章 环境,工具与准备工作第3章 模块,路由与获取请求参数第4章 构建验证层第5章 REST与RESTFul第6章 A ...
- CentOS 7安装后的一些工作记录
安装net-tools: yum install -y net-tools 安装epel源 yum install epel-release 安装fail2ban yum install fail2b ...
- iOS 开发中一些 tips
tableView 的 tableHeaderView 高度不正确的问题: func forceRefreshHeader() { let size = headerView.systemLayout ...
- jenkins之插件下载方法
jenkins插件下载方法有两种,在线下载和离线下载方式 在线下载 就是在安装好了jenkins之后,进入jenkins的插件管理页面,搜索想要的插件,点击安装即可 例如:安装git插件 问题:有时候 ...
- jstl.jar下载地址
下载地址: 链接:https://pan.baidu.com/s/15_B1QLelWOvTGdC7BoAp4A 密码:vmdr
- 阿里云服务器CentOS6.9安装maven
1.下载maven http://maven.apache.org/download.cgi 2.移动到linux yangyuke用户下(此处由于我设置进入linux的是自定义用户yangyuke, ...