Java小强个人技术博客站点    手机版
当前位置: 首页 >> 理论 >> Integer.parseInt和Integer.valueOf区别

Integer.parseInt和Integer.valueOf区别

8820 理论 | 2023-2-16

Integer.parseInt多次解析同一个字符串得到的int基本类型数据是相等的。
Integer.valueOf多次解析相同的一个字符串时,得到的是Integer类型的对象:如果s字符串对应的整数值在 -128~127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。


测试代码

public class LambdaTest {
    public static void main(String[] args) {
        int integer1 = Integer.parseInt("22");
        int integer2 = Integer.parseInt("22");
        int integer3 = Integer.parseInt("222");
        int integer4 = Integer.parseInt("222");
        // 基本类型用“==”比较的是两个值的大小
        System.out.println("integer1 == integer2\t" + (integer1 == integer2));
        System.out.println("integer3 == integer4\t" + (integer3 == integer4));

        Integer objInt1 = Integer.valueOf("22");
        Integer objInt2 = Integer.valueOf("22");
        Integer objInt3 = Integer.valueOf("222");
        Integer objInt4 = Integer.valueOf("222");
        // 不在-128~127之间,通过Integer.valueOf(s)解析出的两个对象i1和i2是不同的对象,对象中的value值相同
        System.out.println("objInt1 == objInt2\t" + (objInt1 == objInt2));
        System.out.println("objInt1.equals(objInt2)\t" + (objInt1.equals(objInt2)));
        System.out.println("objInt3 == objInt4\t" + (objInt3 == objInt4));
        System.out.println("objInt3.equals(objInt4)\t" + (objInt3.equals(objInt4)));
    }

}


Integer.parseInt把字符串解析成int基本类型,Integer.valueOf把字符串解析成Integer对象类型。


看下JDK源码

将字符串参数分析为有符号十进制整数。字符串中的字符必须全部为十进制数字,但第一个字符可以是表示负值的 ASCII 减号 () 或表示正值的 ASCII 加号 '-' '+' ('\u002D''\u002B')。返回生成的整数值,就像参数和基数 10 作为方法的parseInt(String, int)参数给出一样。
参数:s – 包含 String 要解析的 int 表示
返回:由十进制参数表示的整数值。
抛出:NumberFormatException – 如果字符串不包含可解析的整数。

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
}


将字符串参数分析为第二个参数指定的基数中的有符号整数。字符串中的字符必须全部是指定基数的数字(由是否Character.digit(char, int)返回非负值确定),但第一个字符可以是表示负值的 ASCII 减号 () 或表示正值的 ASCII 加号 '-' '+' ('\u002D''\u002B')。返回生成的整数值。
如果发生以下任何情况,将引发类型的 NumberFormatException 异常:
第一个参数是 or 长度 null 为零的字符串。
基数小于 Character.MIN_RADIX 或大于 Character.MAX_RADIX。
字符串的任何字符都不是指定基数的数字,但第一个字符可以是减号 () 或加号 '-' '+' ('\u002D''\u002B'),前提是字符串的长度大于 1。
字符串表示的值不是 类型的 int值。
例子:
       parseInt("0", 10) returns 0
       parseInt("473", 10) returns 473
       parseInt("+42", 10) returns 42
       parseInt("-0", 10) returns 0
       parseInt("-FF", 16) returns -255
       parseInt("1100110", 2) returns 102
       parseInt("2147483647", 10) returns 2147483647
       parseInt("-2147483648", 10) returns -2147483648
       parseInt("2147483648", 10) throws a NumberFormatException
       parseInt("99", 8) throws a NumberFormatException
       parseInt("Kona", 10) throws a NumberFormatException
       parseInt("Kona", 27) returns 411787
       
参数:
s – String 包含要解析的整数表示形式
基数 – 解析 s时要使用的基数。
返回:由指定基数中的字符串参数表示的整数。
抛出:NumberFormatException – 如果不包含 String 可解析的 int.

public static int parseInt(String s, int radix)
    throws NumberFormatException
{
}



返回一个 Integer 保存指定 String的值的对象。参数被解释为表示有符号十进制整数,就像为方法提供 parseInt(String) 参数一样。结果是一个 Integer 对象,该对象表示字符串指定的整数值。
换句话说,此方法返回一个 Integer 等于以下值的对象:
new Integer(Integer.parseInt(s))
参数:s – 要解析的字符串。
返回:保存 Integer 由字符串参数表示的值的对象。
抛出:NumberFormatException – 如果字符串无法解析为整数。

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


返回表示 Integer 指定 int 值的实例。如果不需要新 Integer 实例,则此方法通常应优先于构造函数 Integer(int)使用,因为此方法可能会通过缓存频繁请求的值来产生明显更好的空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。
参数:i – 一个 int 值。
返回:表示 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);
}



valueOf其实还是调用了parseInt,然后判断是否返回新的对象。parseInt除了可以解析十进制的字符串以外,也可以解析比如十六进制的字符串,但是需要指定参数,parseInt传递了默认参数10。


java.jpg


END

推荐您阅读更多有关于“ Integer parseInt valueOf ”的文章

上一篇:Java8中Stream使用示例 下一篇:MySQL索引失效的几种情况

猜你喜欢

发表评论: