Java中Integer.valueOf(String s)和Integer.parseInt(String s)及其他基本类型与引用类型的区别

120 阅读2分钟
JavaInteger类中,有Integer.valueOf(String s)和Integer.parseInt(String s)两个静态方法,他们都能够将字符串转换为整型,他们到底有什么区别呢?今天就来分析下。

本文目录

  1. 源码分析 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常量。只是将是数字的字符串转成数字,返回的是int型变量不具备方法和属性。

Integer.valueOf(String s)将会返回引用类型Integer对象。将一个实际值为数字的变量先转成String型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了。

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数据类型,则使用parseInt(String s)方法。 如果需要包装类Integer对象,则使用Integer.valueOf(String s)方法。 同样Integer、Long、Double和Float都是一样的道理。

  1. 《阿里规约》规定 在《阿里巴巴Java开发手册》中,也有对包装类对象比较的说明,内容如下:
7. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 在-128127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。