【JAVA】探讨 Java 中 valueOf 和 parseInt 的区别

Integer.parseInt和Integer.valueOf区别 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。Integer.parseInt多次解析同一个字符串得到的int基本类型数据是相等的。Integer.valueOf多次解析相同的一个字符串时,得到的是Integer类型的对象:如果s字符串对应的整数值在 -128127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128。 阅读详情

前言

在编程中,遇到类型转换,好像会经常用到 parseInt 和 valueOf,当然这里只拿 Integer 类型进行陈述,其他类型也是雷同的;

想必有读者也跟我一样,经常交叉使用这两个方法,但却不知道这两者到底有什么区别,接下来就来探究一番;  

区别

  • Integer.parseInt(s) 的作用就是把字符串 s 解析成有符号基本类型的 int;
  • Integer.valueOf(s) 把字符串 s 解析成 Integer 对象类型,返回的对象可以调用 Integer 中的方法;

接下来,通过源码进行逐一解析;  

parseInt

我们首先点进 parseInt() 方法中,

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

可以看到,这个被我们调用的 parseInt() 方法返回了一个重载方法:

public static int parseInt(String s, int radix) throws NumberFormatException {
    if (s == null) {
        throw new NumberFormatException("null");
    } else if (radix < 2) {
        throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
    } else if (radix > 36) {
        throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
    } else {
        boolean negative = false;
        int i = 0;
        int len = s.length();
        int limit = -2147483647;
        if (len <= 0) {
            throw NumberFormatException.forInputString(s);
        } else {
            char firstChar = s.charAt(0);
            if (firstChar < '0') {
                if (firstChar == '-') {
                    negative = true;
                    limit = -2147483648;
                } else if (firstChar != '+') {
                    throw NumberFormatException.forInputString(s);
                }

                if (len == 1) {
                    throw NumberFormatException.forInputString(s);
                }

                ++i;
            }

            int multmin = limit / radix;

            int result;
            int digit;
            for(result = 0; i < len; result -= digit) {
                digit = Character.digit(s.charAt(i++), radix);
                if (digit < 0 || result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }

                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
            }

            return negative ? result : -result;
        }
    }
}
复制代码

1、首先看到的是,该方法传入了两个参数,parseInt(String s, int radix),这个可以根据被调用时传入的参数,return parseInt(s, 10);,盲猜一下,s 就是表示要转换成数字型的字符串,而 radix 英文是基数的意思,这里应该表示进制,即这个传入的字符串是多少进制的,那到底是不是呢,我们接着往下看;

2、这里先是对字符串 s 是否为空,以及 radix 的大小进行一个判断,不符合条件则抛出 NumberFormatException 异常,也就是数字格式化异常;

if (s == null){
    throw new NumberFormatException("null");
} else if (radix < 2) {
    throw new NumberFormatException("radix " + radix + " less than Character.MIN_RADIX");
} else if (radix > 36) {
    throw new NumberFormatException("radix " + radix + " greater than Character.MAX_RADIX");
} else {
复制代码

3、接着往下,再一次对长度进行一个校验,

int len = s.length();
if (len <= 0) {
    throw NumberFormatException.forInputString(s);
} else {
	...
}
复制代码

我在这里只想到了一个能让它抛出异常的条件,

Integer.parseInt("");
复制代码

运行结果:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.base/java.lang.Integer.parseInt(Integer.java:662)
	at java.base/java.lang.Integer.parseInt(Integer.java:770)
复制代码

4、接下来会检测第一个字符是啥,如果是 -,则将 negative 设置成 true,表示这是个负数,并且将边界 limit 设置成最小边界;

如果不是 +,则表示该字符既不是数字,不也是性质符号,因此抛出 NumberFormatException 异常;

如果字符串 s 的长度只有1,则表明这是非数字,不符合要求,也抛出 NumberFormatException 异常;

++i 是因为如果第一位是符号的话,那么在后续的循环中追加数字则直接跳过首位;

 char firstChar = s.charAt(0);
 if (firstChar < '0') {
     if (firstChar == '-') {
         negative = true;
         limit = -2147483648;
     } else if (firstChar != '+') {
         throw NumberFormatException.forInputString(s);
     }

     if (len == 1) {
         throw NumberFormatException.forInputString(s);
     }

     ++i;
 }
复制代码

5、根据进制来调整边界,以防越界;

int multmin = limit / radix;
复制代码

6、Character.digit() 用于将字符转为为对应进制的整数,如果该字符不是进制内的就返回-1,例如输入的字符是9,但是进制是2,那么就不符合,则会返回-1;

然后就是进行计算;

int result;
int digit;
for(result = 0; i < len; result -= digit) {
    digit = Character.digit(s.charAt(i++), radix);
    if (digit < 0 || result < multmin) {
        throw NumberFormatException.forInputString(s);
    }

    result *= radix;
    if (result < limit + digit) {
        throw NumberFormatException.forInputString(s);
    }
}
复制代码

7、最后判断是否为负数完成转换;

return negative ? result : -result;
复制代码

valueOf

照例查看源码:

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

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

@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
    return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
}
复制代码

可以看出 valueOf(String s, int radix) 和 valueOf(String s) 都是直接调用返回了 parseInt 方法,而 valueOf(int i) 则是一个 int 转成 Integer 的自动装箱;

接下来探究一下 IntegerCache ,可以看出这是 Integer 的成员内部类,来看源码:

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer[] cache;
    static Integer[] archivedCache;

    private IntegerCache() {
    }

    static {
        int h = 127;
        String integerCacheHighPropValue = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        int size;
        if (integerCacheHighPropValue != null) {
            try {
                size = Integer.parseInt(integerCacheHighPropValue);
                size = Math.max(size, 127);
                h = Math.min(size, 2147483518);
            } catch (NumberFormatException var6) {
            }
        }

        high = h;
        VM.initializeFromArchive(Integer.IntegerCache.class);
        size = high - -128 + 1;
        if (archivedCache == null || size > archivedCache.length) {
            Integer[] c = new Integer[size];
            int j = -128;

            for(int k = 0; k < c.length; ++k) {
                c[k] = new Integer(j++);
            }

            archivedCache = c;
        }

        cache = archivedCache;

        assert high >= 127;

    }
}
复制代码

整体就是初始化一个 IntegerCache.cache 数组,数组里面存储-128到127之间的数字当做是缓存,源码一开始是分析数组长度,然后给数组赋值;

总的来说,三个重构的 valueOf() 方法还是大同小异的:

  • Integer valueOf(int i):返回一个表示指定的 int 值的 Integer 实例;
  • Integer valueOf(String s):返回保存指定的 String 的值的 Integer 对象;
  • Integer valueOf(String s, int radix):返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值;

PCB过孔全介绍 过孔(via)是多层PCB的重要组成部分之一,钻孔的费用通常占PCB制板费用的30%到40%。简单的说来,PCB上的每一个孔都可以称之为过孔。从作用上看,过孔可以分成两类:一是用作各层间的电气连接;二是用作器件的固定或定位。如果从工艺制程上来说,这些过孔一般又分为三类,即盲孔(blind via)、埋孔(buried via)和通孔(through via)。盲孔位于印刷线路板的顶层和底层表面,具 阅读详情

相关推荐

使用Anaconda和conda快速搭建YOLO开发环境

本文详细介绍了如何使用Anaconda和conda为YOLO目标检测项目快速搭建独立、纯净的开发环境。通过创建虚拟环境,有效解决了Python包版本冲突和CUDA兼容性问题,并指导安装GPU版PyTorch等核心依赖,最后通过验证脚本确保环境配置成功,为YOLO开发提供了稳定可靠的基础。

weixin_28829629的博客 164

Java 中 valueOf 和 parseInt 的区别

最后,需要注意的是,无论是 valueOf 方法还是 parseInt 方法,在将字符串转换为数字类型时,都必须确保字符串中只包含数字字符。这个方法也可以将字符串转换为整数类型,但与 valueOf 方法不同的是,它返回的是一个基本数据类型的数字,而不是包装类型的数字。需要注意的是,在处理无效字符串时,parseInt 方法会抛出一个运行时异常,这意味着在代码运行时,如果出现无效字符串,会导致程序异常终止。需要注意的是,valueOf 方法返回的是一个包装类型的数字,而不是基本数据类型的数字。

tyxjolin的专栏 2677

SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网

文章目录一.简要介绍1.node file2.edge file3.lane definitions(1)路段细分(2)邻近的对向车道(3)删除边或车道4.type file(1)简要概述(2)edge定义中引用type文件的示例(3)指定车辆种类的速度限制5.connections file(1)简要概述:(2)connection的属性参数(3)删除连接(4)设置连接的优先级(5)同一边的多个连接二.演示示例:1.自定义编写node file2.自定义编写edge file3.自定义编写type fil

weixin_50632459的博客 5017

parseint与valueOf的区别

string转int中的parseint与valueOf ①首先我们先来了解什么是装箱与拆箱: 装箱:普通类型转换为包装类型 Eg:integer i=10; 拆箱:包装类转换为普通类型 Eg:int j=i; 面试与笔试中会出现的问题; public class Main { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integ

Blooming death的博客 6551

在win10系统上安装opnet14.5注意事项和步聚

opnet 14.5安装避坑!

miracle_eicont的专栏 1038

《Halcon 100项目-9》Halcon彩色线序检查

Halcon彩色线序检查

doubleintfloat的博客 1045

探讨 Java 中 valueOf 和 parseInt 的区别

文章目录前言区别parseInt 前言 在编程中,遇到类型转换,好像会经常用到 parseInt 和 valueOf,当然这里只拿 Integer 类型进行陈述,其他类型也是雷同的; 想必有读者也跟我一样,经常交叉使用这两个方法,但却不知道这两者到底有什么区别,接下来就来探究一番;   区别 Integer.parseInt(s) 的作用就是把字符串 s 解析成有符号基本类型的 int; Integer.valueOf(s) 把字符串 s 解析成 Integer 对象类型,返回的对象可以调用 I

sid10t. 3万+

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

parseInt 跟valueof区别??

1、返回值不同 parseInt 返回值是int型 valueof 返回值是Integer型2、valueof就是调用了parseInt方法的3、parseInt效率比valueof效率高

我只不过想上天罢了的博客 1万+

《Arduino与LabVIEW开发实战》第2章 LabVIEW基础

第2章 LabVIEW基础 2.1 LabVIEW与虚拟仪器 2.1.1 什么是虚拟仪器 仪器仪表发展方向有很多,其中一个重要方向是将计算机和仪器结合起来。具体来说有两种方式,一种是将微处理器或微控制器嵌入到仪器中,构建智能化的内含嵌入式系统的仪器仪表,这是嵌入式仪器;另一种是将仪器装入计算机中,以通用计算机硬件及操作系统为载体,外配数据采集卡等外部设备,通过编制不同功能的程序,以实现多种仪...

jxgy01的博客 490

地平线旭日X3开发板--使用Opencv显示CSI摄像头例程

但是从libsrcampy获取的摄像头图像格式是NV12,无法直接在opencv上显示或者处理,调试过程发现旭日派无法直接用opencv的VideoCapture()调用CSI摄像头,需要使用opencv来做开发的小伙伴可以做个参考,效果如下图所示。需要使用libsrcampy库来获取CSI摄像头图像,为了能够使用opencv的API来处理图像,需要增加NV12转化成bgr像素格式的函数。opencv显示图像.png。

bingdund的博客 541

Java类型转换中valueOf方法和parseInt方法的区别

在Java的类型转换中,我们经常会使用valueOf或者parseInt(parseFloat/parseDouble等)来转换。这二者有什么区别呢?我们看如下的代码: String inputValue = "15.0"; int a = Integer.valueOf(inputValue); Integer c = Integer.valueOf(inputValue); int b = Integer.parseInt(inputValue); Integer d = In

明阳 2875

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(一)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A. genvarB. integerC. wireD.reg参考答案:AA.综合的时候,define无法跨文件列表生效B.宏定义文件最好放在一个文件中集中管理,防止出现不同的项目需要修改不同的宏定义值,但是却漏改了某些地方的情况出现。

qq_42135020的博客 5781

探讨 Java 中valueOf和parseInt的区别

在编程中,遇到类型转换,好像会经常用到parseInt和valueOf,当然这里只拿Integer类型进行陈述,其他类型也是雷同的;想必有读者也跟我一样,经常交叉使用这两个方法,但却不知道这两者到底有什么区别,接下来就来探究一番;

Java技术攻略的博客 226

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java中Integer.parseInt 和 Integer.valueOf 区别

Integer.parseInt() 和 Integer.valueOf() 都是用来 将String转换为Int的,但是为什么Java会提供两个这样的方法呢,他们如果是同样的操作,岂不是多此一举? 我们来深挖Java源代码一探究竟。 Integer.parseInt(),返回一个原子类型int. Integer.valueOf(), 返回的是封装的Integer对象。 Integer.par...

u013728021的博客 3501

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Integer的parseInt和valueOf的区别

Integer的parseInt和valueOf的区别 Integer的parseInt和valueOf的区别parseInt(String s)valueOf(String s) 先来看一下下面这段代码 String s = "1"; System.out.println(Integer.valueOf(s)); System.out.println(Integer.parseInt(s)); 输出结果是什么? 没错,一样都是1。 两个方法都可以把数字类型字符串转成int类型整数,但是这两个方法还是有

qq_45896330的博客 8581

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java Integer.valueOf()和Integer.parseInt()的区别

前言 大家都知道Integer类中有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型。说到这里你肯定会想同一个功能为什么要提供两个不同的方法,这不是浪费吗? 区别 Integer.parseInt(String s)将会返回int常量。 Integer.valueOf(String s)将会返回Integer类型,如果存在缓存将会返回缓存中已有的对象。 使用不当将会产生的问题 由于Java的自动拆箱和装箱机制导

李光 未来科技 5258

Integer中的 valueOf 和 parseInt

1、场景 当需要将 String 类型的字符数字转换为 int 类型时,我们可能会用到 Integer.valueOf() 或者 Integer.parseInt() ,这两个函数都可以将字符数字转换成整型。 2、源码 对 Integer.valueOf(String s) 来说: public static Integer valueOf(String s) throws Nu...

tiankong_12345的博客 6941

Integer类的parseInt与valueOf的区别

当我们想把字符串转换成int变量时,可以用parseInt与valueOf两个方法。 但是,我们进入源码,看下Integer类下这两个方法 我们看parseInt()这个方法是如何实现的 public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); } ...

qq_35331086的博客 217

Java---Integer.parseInt和Integer.valueOf到底有什么区别?

有次写代码的时候,在用Integer.parseInt的时候,想了想其实我用Integer.valueOf也是可以的,但是觉得应该不会有两个功能相同的方法,就想知道到底有什么区别? 找出Integer.valueOf(String s)源码 public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); } 而Intege

zzZsleep7的博客 323

Integer.valueOf和Integer.parseInt

在日常开发工作中,我们经常需要将一个字符串值转换成整型值,这个时候我们可以选择Integer.valueOf和Integer.parseInt两个选择. 接下来我们分析下这两个方法的区别. Integer.valueOf返回值是Integer类型 Integer.parseInt返回值是int类型 而且,在Integer类中还有一个内部的缓存类IntegerCache,它默认缓存了[-128, 127]的Integer值. Integer.parseInt很简单,它是将一个字符串转成10进制的int数值.

书唐瑞的博客 795

Integer.parseInt()和Integer.valueOf()的区别

new Integer.valueof()返回的是Integer的对象。 Integer.parseInt() 返回的是一个int的值。 new Integer.valueof().intValue();返回的也是一个int的值。  parseInt public static int parseInt(String s, int radix) throws NumberForm...

Mark_Fei的博客 256
上一篇: 新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼
下一篇: Java 做项目能用到 List 的场景,这篇总结全了
java小姜在线冲
博客等级 码龄4年 53粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值