zoukankan      html  css  js  c++  java
  • Java中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开发手册》中,也有对包装类对象比较的说明,内容如下:

    1. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

    推荐阅读
    1.SpringCloud系列-整合Hystrix的两种方式)
    2.SpringCloud系列-利用Feign实现声明式服务调用)
    3.手把手带你利用Ribbon实现客户端的负载均》
    4.SpringCloud搭建注册中心与服务注册
    5.Spring Boot配置过滤器的两种方式!


    限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。
    关注下方公众号即可免费领取:

     

  • 相关阅读:
    gradle3.0新命令
    Android Studio项目生成Jar包
    《图解HTTP》读书笔记
    Java实现多继承
    Unity3d和Android之间互相调用
    《Gradle权威指南》--Android Gradle NDK支持
    《Gradle权威指南》--Android Gradle测试
    《Gradle权威指南》--Android Gradle多渠道构建
    adb命令大全
    SparseArray源码解析
  • 原文地址:https://www.cnblogs.com/haha12/p/11718025.html
Copyright © 2011-2022 走看看