探讨 Java 中 valueOf 和 parseInt 的区别

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

前言

在编程中,遇到类型转换,好像会经常用到 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 中提取的值;

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

相关推荐

Linux下libdrm实战:从零搭建一个简单的DRM显示程序(附完整代码)

本文是一份Linux下libdrm的实战指南,详细介绍了如何从零开始搭建一个简单的DRM显示程序。通过对比传统Framebuffer的局限性,阐述了现代DRM架构的核心优势与核心对象(FrameBuffer、Plane、CRTC等)的协作流程。文章提供了完整的代码示例,演示了如何打开设备、创建并填充Dumb Buffer、设置CRTC以依次显示红绿蓝纯色画面,并涵盖了编译、运行及进阶开发要点,为嵌入式Linux图形开发提供了扎实的入门基础。

weixin_29183637的博客 408

Java 中 valueOf 和 parseInt 的区别

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

tyxjolin的专栏 2677

用MCP扩展Cursor的5种神奇用法:从文件操作到网页抓取实战

本文深入探讨了如何利用MCP(Model Context Protocol)扩展Cursor AI编程助手,解锁五种高效实用场景。从文件系统操作、网页内容抓取,到数据库查询、Figma设计稿对接,乃至构建自定义MCP服务器,文章通过实战案例展示了如何将Cursor从代码编辑器升级为能理解并操作工作环境的智能助手,显著提升开发效率与自动化水平。

weixin_29231027的博客 316

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

明阳 317

2.设置Salesforce开发环境

Salesforce DX:salesforce Developer Experience (salesforce开发人员体验)LWC:Lightning Web Component(注意首字母是大写的,是一个概念,小写的话有组件本身的含义)CLI:Command Line Interface(命令行界面)version control system (VCS):版本控制系统。

nihaixiao的博客 2200

开源低场MRI系统构建:从原理到三天实现

磁共振成像(MRI)作为现代医学影像的核心技术,其高场强系统存在成本和技术门槛问题。低场MRI通过开源硬件和模块化设计实现技术民主化,采用永磁体替代超导磁体可大幅降低系统复杂度。本文以H型永磁体设计为例,结合MaRCoS开源控制库和PyPulseq脉冲序列工具,展示了如何快速构建教育级MRI系统。关键技术包括遗传算法优化的匀场方案、CNC加工的梯度线圈,以及基于Red Pitaya的SDR控制架构。这种轻量化方案特别适合医学物理教学和脉冲序列开发验证,为MRI技术在资源有限地区的普及提供了新思路。

weixin_30470643的博客 450

java学习笔记(二)parseInt和valueOf 以及字符串+和StringBuilder的区别

parseInt和valueOf 我们平时应该都用过或者见过parseInt和valueOf这两个方法。一般我们是想把String类型的字符数字转成int类型。从这个功能层面来说,这两个方法都一样,都可以胜任这个功能。 但是,我们进入源码,看下Integer类下这两个方法 parseInt public static int parseInt(String var0) throws NumberF...

buring_GG的专栏 415

当Flowable遇上AI:智能流程决策的未来探索

本文探讨了Flowable工作流引擎与AI技术的融合,构建智能流程决策系统的前沿实践。通过动态流程控制、机器学习优化表达式、自然语言生成规则等创新方法,显著提升业务流程的自动化水平和决策效率。重点解析了AI如何赋能Flowable核心引擎,实现从静态规则到动态智能的跨越式发展。

weixin_29271053的博客 394

Java中的valueOf和parse...()

String和double的valueOf和parse...String的valueOf()Double的转换Double.valueOf()Double.parseDouble()区别 String的valueOf() 将任何对象转换成字符串类型。 总共有9个重载方法, 对于参数为char,都是通过new String()返回 对于参数为boolean,将返回对应的字符串:true或者fal...

Joe_owl的专栏 1万+

ESXi 6.7升级17700523补丁全流程:从下载到验证的保姆级教程

本文提供ESXi 6.7升级17700523补丁的完整流程指南,涵盖从下载、上传到验证的详细步骤。通过SSH命令和vSphere Client操作,确保系统管理员能够安全高效地完成补丁升级,提升虚拟化环境的安全性和稳定性。

linux6sysadmin的博客 840

28、解耦控制与晶圆表面缺陷模式识别

本文介绍了两种不同领域的技术方法:基于端口受控哈密顿(PCH)的三水箱液位系统解耦控制方法,以及基于无监督学习的晶圆表面缺陷模式识别方法。前者通过能量整形实现系统解耦与稳定控制,具有良好的抗干扰性和鲁棒性;后者采用无监督预训练与分类微调两阶段策略,利用WaUSM采样方法提升特征提取能力,在WM-811K数据集上实现了先进的分类性能。文章对比了两种方法的核心技术与优势,并探讨了其在工业控制与半导体制造中的应用前景及未来发展方向,为相关领域的研究与实践提供了有价值的参考。

git9versioner的博客 75

java.lang包,包装类,Math类,Object类,Class类,字符串操作(String,StringBuffer)

java.lang包: java.lang包是一个java内置的一个基础包,其中包含了一系列程序中要用到的类 在默认情况下,每个java程序都会自动导入该包,因此无须再程序中显式的声明 包装类: java提供一系列包装类,以便将原始数据类型当作对象进行操作 在java.lang包中,对于每个原始数据类型都有一个相应的包装类 原始数据类型和包装类对照表: 原始数据类型---------------------包装类 boolean(布尔型)Boolean byte(字节型) Byte ch

weixin_44752188的博客 328

YOLOv8源码解析与复现:ShuffleAttention:高效的混合注意力机制 实现通道和空间混合注意力

随着深度学习在计算机视觉领域的飞速发展,卷积神经网络(CNNs)已经成为图像分类、目标检测、语义分割等任务的核心。为了进一步提升模型的性能,研究者们引入了“注意力机制”,旨在让网络能够动态地关注输入数据中最具信息量的部分。经典的注意力模块,如SE-Net(Squeeze-and-Excitation Networks)和CBAM(Convolutional Block Attention Module),通过通道注意力或结合通道与空间注意力,显著增强了模型的特征表达能力。

FJN110的博客 556

探讨 Java 中valueOf和parseInt的区别

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

Java技术攻略的博客 226

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java中Integer.parseInt 和 Integer.valueOf 区别

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

u013728021的博客 3501

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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的自动拆箱和装箱机制导

李光 未来科技 5259
上一篇: ExecutorService、Callable、Future实现有返回结果的多线程原理解析
下一篇: 总览 Java 容器--集合框架的体系结构
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值