首页 > 编程语言 >Java中Integer.parseInt和Integer.valueOf,你还在傻傻分不清吗?

Java中Integer.parseInt和Integer.valueOf,你还在傻傻分不清吗?

时间:2024-12-17 09:58:43浏览次数:11  
标签:Java String int valueOf 源码 parseInt Integer

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值可以直接使用==进行判断
但是在-128至127区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断

标签:Java,String,int,valueOf,源码,parseInt,Integer
From: https://blog.csdn.net/2402_85428625/article/details/144516631

相关文章

  • java基础--接口
    1.抽象类:里面有抽象方法时,就要声明该类为抽象类publicabstractclassAnimal{privateStringname;privateintage;publicAnimal(){}publicAnimal(Stringname,intage){this.name=name;this.age=age;}/**......
  • JAVA开源毕业设计 在线文档管理系统 Vue.JS+SpringBoot+MySQL网上订餐系统
    本文项目编号T039,文末自助获取源码\color{red}{T039,文末自助获取源码}......
  • JAVA开源毕业设计 在线文档管理系统 Vue.JS+SpringBoot+MySQL网上订餐系统
    本文项目编号T039,文末自助获取源码\color{red}{T039,文末自助获取源码}......
  • Z240003基于Java+SpringBoot+Vue实现的宠物领养系统的设计与实现
    基于SpringBoot+Vue实现的宠物领养系统1.项目描述2.运行环境3.运行截图4.源码获取1.项目描述基于SpringBoot+Vue实现的宠物领养系统分为用户和管理员两种角色用户端主要实现了首页、宠物领养、流浪宠物救助、宠物喂养点、丢失宠物查看、流浪宠物救助站、宠物论坛......
  • Servlet介绍与配合javaWeb的使用
    文章目录1.Servlet介绍2.servlet的使用2.1创建项目2.2新建类2.3注册类2.4访问localhost:8080/myServlet.do2.5更简单的方式,使用注解(@WebServlet)2.6其他:修改欢迎页3.总结1.Servlet介绍Servlet是一种Java编写的服务器端程序,用于处理HTTP请求并生成动态Web内......
  • java观察者模式多人上线下线2.0
    packageorg.wangbiao.es.restclient.util.onlin;importjava.util.Observable;importjava.util.Observer;/***接受者*/publicclassMyObserverimplementsObserver,Player{privateStringname;publicMyObserver(Stringname){this.name......
  • 计算机毕业设计原创定制(免费送源码):Java+Thinkphp+MySQL PHP心理咨询预约平台的设计
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对心理健康咨询等问题,对其进行研究分析,然后开发设计出心理咨询预约平台以解决问题。心理咨询......
  • 计算机毕业设计原创定制(免费送源码):Java+Springboot+MySQL 水环境检测系统的设计与实现
    摘 要在我国,水源的污染是不可忽视的问题。对于水质监测进行数据的采集工作,目前主要通过人工实现。因此,部分地区的采集工作,实施起来难度很大,比如恶劣环境和偏僻山区等地。所以,目前对于水质监测的研究,主导方向是建立更加高效完善,智能化的水质监测系统。近几年,无线传......
  • java程序设计2(二)
    自动装箱和自动拆箱:基本数据类型和包装类型之间可以直接相互转换的包装类通常可以区分有效数据和无效数据,例如:0和nullString类获取字符串的方式【企业面试】Stringstr1="hello";    这种获取字符串的方式,在串池中完成字符串对象的创建,有-不再创建Stringstr......
  • one-java-agent-00-统一管理众多的Java Agent
    javaagent系列javaagent介绍javaagent-02-JavaInstrumentationAPIjavaagent-03-JavaInstrumentation结合bytekit实战笔记agentattachjavaagent-03-JavaInstrumentation结合bytekit实战笔记agentpremainjavaagent-04-统一管理众多的JavaAgentjavaage......