Integer.parseInt(s)与Integer.valueOf(s)的区别详解

2023-11-06

一、Integer.parseInt(s)用法

        String s1 = "1000";
        String s2 = "1000";
        int n1 = Integer.parseInt(s1);
        int n2 = Integer.parseInt(s2);
        if (n1 == n2) {         System.out.println("Integer.parseInt(s1) == Integer.parseInt(s2)");
        }

输出:

Integer.parseInt(s1) == Integer.parseInt(s2)

Integer.parseInt(s)的作用就是把字符串s解析成有符号的int基本类型。

二、Integer.valueOf(s)用法

        String s = "123";
        Integer integer = Integer.valueOf(s);
        System.out.println("integer : " + integer);

Integer.valueOf(s)把字符串s解析成Integer对象类型,返回的integer 可以调用对象中的方法。

三、Integer.parseInt(s)与Integer.valueOf(s)的区别

Integer.parseInt(s)
Integer.parseInt(s)多次解析同一个字符串得到的int基本类型数据是相等的,可以直接通过“==”进行判断是否相等。

        String s = "10000";
        if (Integer.parseInt(s) == Integer.parseInt(s)) { //true
            System.out.println("Integer.parseInt(s) == Integer.parseInt(s)");
        }

输出:

Integer.parseInt(s) == Integer.parseInt(s)

int是基本类型,不含有equals方法,所以只能用“==”比较,基本类型用“==”比较的是两个值的大小。

Integer.valueOf(s)
Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象,得到的对象有时是同一个对象,有时是不同的对象,要根据把s字符串解析的整数值的大小进行决定:如果s字符串对应的整数值在 -128~127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。不管对象是否相等,对象中的value值是相等的。

        String s = "100";
        Integer i1 = Integer.valueOf(s);
        Integer i2 = Integer.valueOf(s);
        if (i1 == i2) { //两个对象相等
            System.out.println("i1 == i2");
        }
        if (i1.equals(i2)) { //两个对象中的value值相等
            System.out.println("i1.equals(i2)");
        }

输出:

i1 == i2
i1.equals(i2)

通过上面示例,字符串s对应的整数值为100,在-128~127之间,所以解析出的两个对象i1和i2是相等的。equals是比较的两个对象i1和i2中的value值是否相等,“==”是比较i1和i2两个对象是否相等。

当s字符串对应的整数值不在-128~127之间,示例如下:

        String s = "1000";
        Integer i1 = Integer.valueOf(s);
        Integer i2 = Integer.valueOf(s);
        if (i1 != i2) { //两个对象不相等
            System.out.println("i1 != i2");
        }
        if (i1.equals(i2)) { //两个对象中的value值相等
            System.out.println("i1.equals(i2)");
        }

输出:

i1 != i2
i1.equals(i2)

可见,当s字符串对应的整数值为1000,不在-128~127之间,通过Integer.valueOf(s)解析出的两个对象i1和i2是不同的对象,对象中的value值是相同的。

原因: 为什么Integer.valueOf(s)会出现这种情况呢?这是由于JDK中源码已经定义好的。由于在-128~127之间的整数值用的比较频繁,当每次要创建一个value值在-128~127之间的Integer对象时,直接从缓存中拿到这个对象,所以value值相同的Integer对象都是对应缓存中同一个对象。-128~127之外的整数值用的不是太频繁,每次创建value值相同的Integer对象时,都是重新创建一个对象,所以创建的对象不是同一个对象。这个从JDK中源码可以看出

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

然后上面的源码又调用了Integer.valueOf(int)方法

    public static Integer valueOf(int i) {
        /*IntegerCache.low为 -128;
        IntegerCache.high默认为127,但可以在JVM进行配置,一般默认就是127*/
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            /*如果i在-128~127之间,从缓存中取对象*/
            return IntegerCache.cache[i + (-IntegerCache.low)];
        /*如果i不在-128~127之间,重新创建一个对象*/
        return new Integer(i);
    }

四、Integer.parseInt(s)与Integer.valueOf(s)的联系

Integer.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。

把int类型包装成Integer类型

        Integer i = 1000;  //自动把1000类型包装成Integer类型
        Integer i2 = 1000;
        if (i != i2) {
            System.out.println("i != i2");
        }
        if (i.equals(i2)) {
            System.out.println("i.equals(i2)");
        }

输出:

i != i2
i.equals(i2)

把Integer类型自动解包装成int类型

        Integer n = new Integer(100);
        int n1 = n;
        System.out.println("n1 = " + n1);

输出:

i.equals(i2)
n1 = 100
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Integer.parseInt(s)与Integer.valueOf(s)的区别详解 的相关文章

随机推荐

  • chatgpt赋能python:Python:一门强大的编程语言

    Python 一门强大的编程语言 Python是一门面向对象 解释型的高级动态编程语言 广泛应用于Web开发 数据科学 人工智能 计算机网络等各个领域 在过去的10年中 Python经历了快速的发展 并成为了世界上最受欢迎的编程语言之一 P
  • 如何在Silverlight 控件中设置默认.xaml 页面

    每个Silverlight 项目可以有多个 xaml 文件 但每次只能看到一个 xaml 页面 当你在Visual Studio 中创建一个Silverlight 项目是 将创建一个默认的名字叫做 MainPage xaml 的 xaml
  • SolidWorks二次开发,工程图螺纹孔标注

  • Python使用tensorflow实现图像识别(猫狗大战)-01

    Python使用tensorflow实现图像识别 猫狗大战 01 import data py import tensorflow as tf import numpy as np import os 引入tensorflow numpy
  • 三种socket超时方法

    文章目录 概述 通过alarm定时器实现 通过select实现 通过SO RCVTIMEO和SO SNDTIMEO实现 概述 socket超时有三种处理办法 使用alarm定时器 设置一定的超时时间 通过产生SIGALRM中断信号实现soc
  • qt creator编译qt工程时报错:undefined reference to

    qt creator编译qt工程时报错 undefined reference to qt creator编译qt工程时报错 该错误指向了本地文件 且经过调研知道 该类错误一般都是链接问题 仔细查看一下pro和pri文件 发现SystemL
  • LeetCode 704. 二分查找 27. 移除元素

    文章目录 前言 LeetCode 704 二分查找 1 题目 2 思路 3 代码 LeetCode 27 移除元素 1 题目 2 思路 3 代码 总结 前言 为了巩固所学的知识 作者尝试着开始发布一些学习笔记类的博客 方便日后回顾 当然 如
  • 【Flutter 问题系列第 72 篇】在 Flutter 中使用 Camera 插件拍的图片被拉伸问题的解决方案

    这是 Flutter 问题系列第 72 篇 如果觉得有用的话 欢迎关注专栏 Flutter SDK 2 5 0 Dart SDK 2 14 Android Studio 2021 2 1 Pathc 1 一 问题描述 项目中要自定义相机页
  • C++之仿函数

    最近再看STL源码的时候看到里面的实现用了大量的仿函数 然后上网搜集了一些关于仿函数的知识 仿函数 Functor 又称为函数对象 Function Object 是一个能行使函数功能的类 仿函数的语法几乎和我们普通的函数调用一样 不过作为
  • 网络编程学习:UDP发送消息new String(packet.getData(),0,packet.getLength())报错

    最近鄙人在使用IDEA学习网络编程的UDP消息发送时 遇到了以下的报错提醒 在使用IDEA时 为了方便我们习惯性的设置了自动导包 com sun org apache xpath internal operations String 和 j
  • Swift的二分法查找实践

    Swift的二分法查找实践 Swift的二分法查找实践 在这篇教程中我们会使用计算机科学里一个基础的算法 二分法查找 binary search 我们也会实现一个二分法查找的项目 快速自动匹配 介绍 在一个数组里查找某个元素 最直接的方法是
  • Cocos Shader实现HSL和RGB颜色模型

    HSL和RGB是两种常见的颜色模型 被广泛应用于计算机图形学 数字图像处理 Web设计等领域 在进行颜色处理时 经常需要将HSL和RGB相互转换 本demo演示如何通过Cocos Creator 3 7游戏引擎 用HSL模型来调节图片颜色
  • PDU会话建立流程(8)-SM Policy Association的建立

    相关文章会在公众号同步更新 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避免通过二手 甚至多手的资料 以讹传讹误导网友 在介绍完流程详解后 会整理专题内容 比如切片 服务发现 QoS流端到端
  • JPBM4.4基础及数据库说明

    JPBM4 4基础及数据库说明 对jBPM4 4数据库的几张表简单介绍 A 资源库和运行时表结构 JBPM4 DEPLOYMENT 流程定义表 JBPM4 DEPLOYPROP 流程定义属性表 JBPM4 EXECUTION 流程实例表 主
  • nacos--基础--2.5--部署--集群--传统

    nacos 基础 2 5 部署 集群 传统 前提 使用hd用户登陆 完成基础环境搭建 https blog csdn net zhou920786312 article details 118212302 1 机器 IP 端口 备注 192
  • 云计算是什么

    博客主页 微笑的段嘉许博客主页 欢迎关注 点赞 收藏 留言 本文由微笑的段嘉许原创 51CTO首发时间 2023年2月1日 坚持和努力一定能换来诗与远方 作者水平很有限 如果发现错误 一定要及时告知作者哦 感谢感谢 不要偷走我小火车哦 文章
  • text11

    word 剪切板 ul li span style font family none background color rgb 255 255 255 span li li span style font family none backg
  • 比较编译技术--Java 代码的静态编译和动态编译中的问题

    本文是关于实时 Java 的 系列文章 共 5 部分 的第二篇 考察了 Java 语言的本地代码编译所涉及的一些问题 单独使用动态 即时 编译或静态 提前 编译都不能满足所有 Java 应用程序的需求 作者在各种执行环境中对这两种编译技术进
  • Linux命令_awk & 字符串过滤

    前言 被称为 Linux 文本操作三剑客之一的 awk 不但可以处理复杂文件输出 更是一门编程语言 支持对文本每行每列精确读出 格式化输出 正则匹配 if 判断 数组 循环 目录 1 语法 1 1 选项参数 1 2 内置变量 1 3 运算符
  • Integer.parseInt(s)与Integer.valueOf(s)的区别详解

    一 Integer parseInt s 用法 String s1 1000 String s2 1000 int n1 Integer parseInt s1 int n2 Integer parseInt s2 if n1 n2 Sys