parseInt()如何不同于valueOf() ?

它们似乎对我做了完全相同的事情(也适用于parseFloat(), parseDouble(), parseLong()等,它们与Long.valueOf(字符串)有什么不同?

另外,按照惯例,哪一个更可取,更常用呢?


当前回答

valueOf -转换为包装器类 parseInt -转换为基本类型

整数。parseInt只接受String并返回原始整数类型(int)。

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

Iteger.valueOf accept int and String. If value is String, valueOf convert it to the the simple int using parseInt and return new Integer if input is less than -128 or greater than 127. If input is in range (-128 - 127) it always return the Integer objects from an internal IntegerCache. Integer class maintains an inner static IntegerCache class which acts as the cache and holds integer objects from -128 to 127 and that’s why when we try to get integer object for 127 (for example) we always get the same object.

Iteger.valueOf(200)将给出200的新整数。比如new Integer(200) Iteger.valueOf(127)与Integer = 127相同;

如果你不想将String转换为Integer,请使用iter . valueof。

如果你不想将String转换为简单的int,请使用Integer.parseInt。它工作得更快。

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

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

  private static class IntegerCache {
      static final int low = -128;
      static final int high;
      static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

比较Integer.valueOf(127) == Integer.valueOf(127)返回true

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
a == b; // return true 

因为它从缓存中获取具有相同引用的Integer对象。

但是Integer. valueof (128) == Integer. valueof(128)为false,因为128超出了IntegerCache的范围,它返回新的Integer,因此对象将有不同的引用。

其他回答

因为您可能正在使用jdk1.5+,它会自动转换为int。所以在你的代码中,它首先返回Integer,然后自动转换为int。

你的代码和

int abc = new Integer(123);

来自本论坛:

parseInt()返回原始整数 类型(int),其中valueOf返回 . lang。整数,它是对象 整数的代表。在那里 是你想要的环境吗 一个Integer对象,而不是 原始类型。 当然,还有一个明显的区别 intValue是一个实例方法吗 其中parseInt是一个静态方法。

valueOf -转换为包装器类 parseInt -转换为基本类型

整数。parseInt只接受String并返回原始整数类型(int)。

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

Iteger.valueOf accept int and String. If value is String, valueOf convert it to the the simple int using parseInt and return new Integer if input is less than -128 or greater than 127. If input is in range (-128 - 127) it always return the Integer objects from an internal IntegerCache. Integer class maintains an inner static IntegerCache class which acts as the cache and holds integer objects from -128 to 127 and that’s why when we try to get integer object for 127 (for example) we always get the same object.

Iteger.valueOf(200)将给出200的新整数。比如new Integer(200) Iteger.valueOf(127)与Integer = 127相同;

如果你不想将String转换为Integer,请使用iter . valueof。

如果你不想将String转换为简单的int,请使用Integer.parseInt。它工作得更快。

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

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

  private static class IntegerCache {
      static final int low = -128;
      static final int high;
      static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

比较Integer.valueOf(127) == Integer.valueOf(127)返回true

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
a == b; // return true 

因为它从缓存中获取具有相同引用的Integer对象。

但是Integer. valueof (128) == Integer. valueof(128)为false,因为128超出了IntegerCache的范围,它返回新的Integer,因此对象将有不同的引用。

整数valueOf(字符串s)

参数被解释为表示一个带符号的十进制整数,就像参数被赋给parseInt(java.lang.String)方法一样。 结果是一个Integer对象,表示字符串指定的整数值。 换句话说,该方法返回一个Integer对象,其值等于: 新的整数(Integer.parseInt (s))

整数。parseInt可以只返回int作为本机类型。

整数。valueOf实际上可能需要分配一个Integer对象,除非该整数恰好是预分配的整数之一。这样成本更高。

如果你只需要本地类型,使用parseInt。如果你需要一个对象,使用valueOf。

此外,由于这种潜在的分配,自动装箱实际上在各方面都不是一件好事。它可以使事情变慢。