java中parseInt()和valueOf()之间的区别?


442

有什么parseInt()不同valueOf()

他们似乎做同样的事情对我来说(也无二parseFloat()parseDouble()parseLong()等等,他们如何不同Long.valueOf(string)

另外,根据惯例,其中哪一个更可取,且使用频率更高?

Answers:


410

好吧,for的API Integer.valueOf(String)确实确实说了String完全像给了一样解释了Integer.parseInt(String)。但是,valueOf(String)返回一个对象,而返回一个原语new Integer()parseInt(String)int

如果您想享受的潜在缓存优势Integer.valueOf(int),则还可以使用以下方法:

Integer k = Integer.valueOf(Integer.parseInt("123"))

现在,如果你想要的是对象,而不是原始的,然后使用valueOf(String)可能比制作一个新的对象出更有吸引力parseInt(String),因为前者是跨始终存在IntegerLongDouble,等。


8
两种方法之间在性能或内存上有什么区别吗?
Logan

90
Integer.valueOf(Integer.parseInt("123"))拥有无利Integer.valueOf("123")Integer.valueOf(123)除了浪费周期和程序的大小。
Thomas Eding

9
有一个区别-由valueOf分配的新Object(可能)带有开销(该对象的内存,处理,GC),而普通int则非常“轻便”。(对于最常见的值,您将获得对预先存在的对象的引用,这对您有所帮助。)
foo 2013年

14
Integer.valueOf(String)的缓存与完全相同Integer.valueOf(int)。实际上,它的实现方式是Integer.valueOf(Integer.parseInt(…))
Holger

11
@Khez它不可能返回原语int。签名说它返回一个Integer,这正是它的作用。当说返回“ new”时,此答案也部分不正确Integer。那不是Javadoc中所说的。可以免费返回已缓存Integer
罗恩侯爵

73

这个论坛

parseInt()返回原始整数类型(int),从而valueOf返回 java.lang.Integer,它是表示整数的对象。在某些情况下,您可能需要Integer对象而不是原始类型。

当然,另一个明显的区别是intValue是实例方法,而parseInt是静态方法。


9
值得一提的是:valueOf版本还将使用内部引用池为给定值返回SAME对象,而不仅仅是具有相同内部值的另一个实例。这意味着给定以这种方式返回的两个Longs,a.equals(b)== true和a == b为true
basszero

进一步证明,对于字符串版本,您是正确的,我在考虑原始版本。Long.valueOf(5)将始终返回相同的对象。字符串版本返回新对象,原始版本返回相同的对象
basszero

1
@bassezero。此外,该池有限制。我认为是-127至
127。– OscarRyz

1
引用池的大小是实现细节的真实示例。在补丁程序发行版中,它的大小甚至可能会增加,您绝对不要依赖它。
Donal Fellows 2010年

@OscarRyz实际上,它是-128到127。请注意,JVM提供了一个参数来为高速缓存设置更高的最高界限。:但是,你不能重新定义最低结合stackoverflow.com/questions/29633158/...
让·弗朗索瓦·Savard

36
Integer.valueOf(s)

类似于

new Integer(Integer.parseInt(s))

区别在于valueOf()返回Integer,然后parseInt()返回int(原始类型)。还要注意,这valueOf()可能会返回一个缓存的Integer实例,这会在==测试结果间歇性地正确的情况下引起混乱的结果。在自动装箱之前,便利性可能有所不同,在Java 1.5之后,这并不重要。

而且,Integer.parseInt(s)也可以采用原始数据类型。


4
对于具有相同参数的连续调用,valueOf()可以返回相同的对象(对于-128至127之间(包括-128和127之间的参数),此参数是必需的)。new Integer()将始终创建一个新对象。
亚当·罗森菲尔德2009年

哪个更常用?我最应该使用哪一个?
点击Upvote

3
如果需要一个整数,请使用parseInt(),如果需要一个整数,请使用valueOf()
matt b

14

看一下Java资料:valueOf正在使用parseInt

/**
 * Parses the specified string as a signed decimal integer value.
 *
 * @param string
 *            the string representation of an integer value.
 * @return an {@code Integer} instance containing the integer value
 *         represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 * @see #parseInt(String)
 */
public static Integer valueOf(String string) throws NumberFormatException {
    return valueOf(parseInt(string));
}

parseInt 退货 int

/**
 * Parses the specified string as a signed decimal integer value. The ASCII
 * character \u002d ('-') is recognized as the minus sign.
 *
 * @param string
 *            the string representation of an integer value.
 * @return the primitive integer value represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 */
public static int parseInt(String string) throws NumberFormatException {
    return parseInt(string, 10);
}

6

Integer.parseInt可以仅将int作为本机类型返回。

Integer.valueOf实际上可能需要分配一个Integer对象,除非该整数恰好是预分配的整数之一。这会花费更多。

如果只需要本机类型,请使用parseInt。如果需要对象,请使用valueOf。

同样,由于这种潜在的分配,自动装箱实际上并不是在所有方面都是好东西。它可以减慢速度。


1

parse *变体返回原始类型,而valueOf版本返回Object。我相信valueOf版本还将使用内部引用池为给定值返回SAME对象,而不仅仅是具有相同内部值的另一个实例。


实际上,这不是真的。起初我是这么认为的,但是Integer.valueOf(String)的Javadocs明确声明它等效于新的Integer(Integer.parseInt(String))。不过,Integer.valueOf(int)确实可以缓存。
迈克尔·迈尔斯

您是正确的String版本,我在想原始版本。Long.valueOf(5)将始终返回相同的对象。
basszero

1

因为您可能正在使用jdk1.5 +,并且在那里自动转换为int。因此,在您的代码中,它首先返回Integer,然后自动转换为int。

您的代码与

int abc = new Integer(123);


0

公共静态整数valueOf(String s)

  1. 该参数被解释为表示一个带符号的十进制整数,就像将参数提供给parseInt(java.lang.String)方法一样。
  2. 结果是一个Integer对象,它表示字符串指定的整数值。

  3. 换句话说,此方法返回一个等于以下值的Integer对象:new Integer(Integer.parseInt(s))


0
  • valueOf-转换为Wrapper类
  • parseInt-转换为原始类型

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

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

Iteger.valueOf接受int和String。如果value是String,则valueOf使用parseInt将其转换为简单的int,如果输入小于-128或大于127则返回新的Integer。如果输入在(-128-127)范围内,则它总是从内部IntegerCache。Integer类维护一个内部静态IntegerCache类,该类充当缓存并保存从-128到127的整数对象,这就是为什么当我们尝试获取127的整数对象(例如)时总是得到相同的对象的原因。

Iteger.valueOf(200)从200这就像给新的整数new Integer(200) Iteger.valueOf(127)是一样的Integer = 127;

如果您不想将String转换为Integer,请使用Iteger.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,因此对象将具有不同的引用。


请不要滥用粗体格式:它会降低您帖子的可读性。
佐伊

-2
  1. 对于ValueOf->,它将创建一个Integer对象。不是原始类型,也不是静态方法。
  2. 如果是ParseInt.ParseFloat->,则返回各自的原始类型。并且是静态方法。

我们应根据需要使用任何一种。在ValueOf实例化对象的情况下。如果我们只需要一些文本的值,它将消耗更多资源,那么我们应该使用parseInt,parseFloat等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.