Integer的parseInt和valueOf的区别
先来看一下下面这段代码
String s = "1";
System.out.println(Integer.valueOf(s));
System.out.println(Integer.parseInt(s));
输出结果是什么?没错,一样都是1。两个方法都可以把数字类型字符串转成int类型整数,但是这两个方法还是有一点区别的,valueOf(String s)方法调用了parseInt(String s, int radix)方法,而parseInt(String s, int radix)方法返回值是一个int类型的值,之后又调用了valueOf(int i)方法将int进行了装箱返回包装类型Integer。
所以如果你不需要返回包装类型,可以直接调用parseInt(String s)方法,效率更高。
下面这段是valueOf(String s)方法的源码
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
可以看到调用parseInt方法的时候还传了一个int类型参数radix,这个参数表示进制,默认使用十进制进行转换。下面是方法的源码,我标注了一些注释。
public static int parseInt(String s, int radix)
throws NumberFormatException
{
/* 警告:在初始化IntegerCache之前,VM初始化期间可能会提前调用此方法。 必须注意不要使用valueOf方法。
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/
//字符串为空则抛出NumberFormatException
if (s == null) {
throw new NumberFormatException("null");
}
//传的进制参数小于2,抛出NumberFormatException,并且提示进制小于最小进制
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}
//传的进制参数小于36,抛出NumberFormatException,并且提示进制小于最大进制
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}
int result = 0;
//negative 用来判断结果是否为负数
boolean negative = false;
//获取字符串长度
int i = 0, len = s.length();
//limit = -2147483647
int limit = -Integer.MAX_VALUE;
//用于在添加下一位数字的前判断是否溢出的值
int multmin;
//需要追加的数字
int digit;
//字符长度大于0
if (len > 0) {
//判断字符串是否有符号
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
//第一个符号是负号,所以结果是负数
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
//不为负数或正数,抛出NumberFormatException
throw NumberFormatException.forInputString(s);
//长度为1,抛出NumberFormatException
if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
//计算 multmin ,注意负数和正数的limit是不一样的,负数的limit = -2147483648,正数的limit = -2147483647
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
//字符不为空,但是字符长度等于0,抛出NumberFormatException
throw NumberFormatException.forInputString(s);
}
//根据正负数的标识来判断结果取正还是取反
return negative ? result : -result;
}

Integer的parseInt和valueOf的区别的更多相关文章
- Integer类的parseInt和valueOf的区别
我们平时应该都用过或者见过parseInt和valueOf这两个方法.一般我们是想把String类型的字符数字转成int类型.从这个功能层面来说,这两个方法都一样,都可以胜任这个功能. 但是,我们进入 ...
- parseInt和valueOf
.parseInt和valueOf.split static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析. static Integer valueOf( ...
- JavaScript 中 Number()、parseInt()、parseFloat()的区别
Number(): 概述:Number 对象由 Number() 构造器创建,是经过封装的能让你处理数字值的对象.在非构造器上下文中 (如:没有 new 操作符),Number 能被用来执行类型转换. ...
- Number()、parseInt() 和 parseFloat() 的区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...
- Number()、parseInt()、parseFloat()的区别
最近在一个项目中遇到:需要在前台页面用javascript去处理很数值的计算. 各种用法都有,为了统一且保证处理方式正确,特地总结了一下相关的数值转换的用法: 作用: Number():可以用于任何数 ...
- Number()、parseInt()和parseFloat()的区别
JS中Number().parseInt()和parseFloat()的区别 三者的作用: Number(): 可以用于任何数据类型转换成数值: parseInt(): 函数可解析一个字符串,并返回一 ...
- js中Number()、parseInt()和parseFloat()的区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...
- (String)、toString()与String.valueOf()的区别
(String).Object.toString()正常情况下跟String.valueOf()没有区别. 但当Object是null的时候.toString会抛出异常.valueOf返回" ...
- Number()、parseInt()、parseFloat()的区别:
Number().parseInt().parseFloat()的区别: Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是 ...
随机推荐
- 51nod1463 找朋友
[传送门] 写的时候一直没有想到离线解法,反而想到两个比较有趣的解法.一是分块,$f[i][j]$表示第$i$块块首元素到第$j$个元素之间满足条件的最大值(即对$B_l + B_r \in K$的$ ...
- 我的ImageIO.write ByteArrayOutputStream为什么这么慢?
File.createTempFile(prefix, suffix),创建一个临时文件,再使用完之后清理即可.但是遇到如下两个坑: String prefix = "temp"; ...
- css 网格布局
一.概述 网格布局(Grid)是最强大的 CSS 布局方案. 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局.以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了. 上 ...
- ArrayList 集合 简单运用
集合 遍历 import java.util.ArrayList; class Demo02 { public static void main(String[] args) { // 创建Arra ...
- HTML音乐标签和滚动
<!-- 音乐标签 --> <embed src="1.mp3" type=""> <embed src="1.mp3& ...
- 回文数 js 解法
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- 【树形DP】骑士
骑士 题目描述 \(Z\)国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的\(Y\)国发动了一场针对Z国的侵略 ...
- Alapha冲刺(3/6)
队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 学习如何评估代码质量 准备Al ...
- 刷题记录:[LCTF]bestphp's revenge
目录 刷题记录:[LCTF]bestphp's revenge 一.知识点 1.SoapClient触发反序列化导致ssrf 2.serialize_hander处理session方式不同导致sess ...
- SpringMVC(中)
一.传值方式 (1)Map Controller @Controller public class MyController { @RequestMapping("first") ...