ChatGPT解决这个技术问题 Extra ChatGPT

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

parseInt()valueOf() 有何不同?

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

此外,按照惯例,哪一个更可取并且更经常使用?


Z
Zach Scrivena

好吧,Integer.valueOf(String) 的 API 确实表明 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) 制作新对象更有吸引力,因为前者始终存在于 IntegerLong、{5 }, ETC。


两种方法之间是否有任何性能或内存差异?
除了浪费周期和程序的大小之外,Integer.valueOf(Integer.parseInt("123"))Integer.valueOf("123")Integer.valueOf(123) 没有任何好处。
有一个区别——由 valueOf 分配的新对象(可能)带有开销(对象的内存、处理、GC),而普通的 int 非常“轻量级”。 (对于最常见的值,您将获得对预先存在的对象的引用,这会有所帮助。)
Integer.valueOf(String) 执行与 Integer.valueOf(int) 完全相同的缓存。事实上,它被实现为 Integer.valueOf(Integer.parseInt(…)) ...
@Khez 它不可能返回原始int。签名说它返回一个 Integer,这正是它所做的。当它说它返回一个“新”Integer时,这个答案也部分不正确。这不是它在 Javadoc 中所说的。返回缓存的 Integer 是免费的。
M
Michael Haren

this forum

parseInt() 返回原始整数类型 (int),其中 valueOf 返回 java.lang.Integer,它是表示整数的对象。在某些情况下,您可能需要一个 Integer 对象,而不是原始类型。当然,另一个明显的区别是 intValue 是一个实例方法,而 parseInt 是一个静态方法。


值得一提的是:valueOf 版本还将使用内部引用池为给定值返回 SAME 对象,而不仅仅是具有相同内部值的另一个实例。这意味着给定以这种方式返回的两个 Long,a.equals(b) == true 和 a == b 为 true
正如进一步证明的那样,您对字符串版本是正确的,我在考虑原始版本。 Long.valueOf(5) 将始终返回相同的对象。字符串版本返回新对象,原始版本返回相同的对象
@bassezero。此外,该池有限制。我认为是-127到127。
参考池的大小是实现细节的真实示例;它甚至可以在补丁版本中增加,你不应该依赖它来做任何事情。
@OscarRyz实际上是-128到127。请注意,JVM提供了一个参数来为缓存设置更高的上限。但是,您不能重新定义最低界限:stackoverflow.com/questions/29633158/…
T
Thomas Dickey
Integer.valueOf(s)

类似于

new Integer(Integer.parseInt(s))

区别在于 valueOf() 返回 Integer,而 parseInt() 返回 int(原始类型)。另请注意,valueOf() 可能会返回缓存的 Integer 实例,这可能会导致令人困惑的结果,其中 == 测试的结果似乎间歇性地正确。在 autoboxing 之前,便利性可能有所不同,在 java 1.5 之后,这并不重要。

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


valueOf() 可以为具有相同参数的连续调用返回相同的对象(并且对于介于 -128 和 127 之间的参数是必需的)。 new Integer() 将始终创建一个新对象。
哪一种使用频率更高?我最应该使用哪一个?
如果你需要一个 int,使用 parseInt(),如果你需要一个 Integer,使用 valueOf()
@Joan d Silva 从你的最后一行,我认为 Integer.parseInt(s) 只能作为一个 String 而 Integer.ValueOf(s) 可以把 int 和 string 作为输入参数
P
Paul Verest

查看 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(不是 Integer

/**
 * 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);
}

i
iny

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

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

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

此外,由于这种潜在的分配,自动装箱实际上在各个方面都不是好事。它可以减慢速度。


A
Andriy

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,则返回 new Integer。如果输入在范围 (-128 - 127) 内,它总是从内部整数缓存。 Integer 类维护一个内部静态 IntegerCache 类,它充当缓存并保存从 -128 到 127 的整数对象,这就是为什么当我们尝试获取 127 的整数对象时(例如)我们总是得到相同的对象。

Iteger.valueOf(200) 将给出 200 的新整数。就像 new Integer(200) Iteger.valueOf(127)Integer = 127 一样;

如果您不想将字符串转换为整数,请使用 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) 是假的,因为 128 超出了 IntegerCache 的范围,它返回新的 Integer,所以对象会有不同的引用。


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

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


实际上,并不完全正确。一开始我自己也是这么想的,但是 Integer.valueOf(String) 的 Javadocs 明确指出它等同于 new Integer(Integer.parseInt(String))。不过,Integer.valueOf(int) 确实会缓存。
您对字符串版本是正确的,我在考虑原始版本。 Long.valueOf(5) 将始终返回相同的对象。
T
TheGraduateGuy

如果您检查 Integer 类,您会发现 valueof 调用 parseInt 方法。最大的区别是调用 valueof API 时的缓存。如果值在 -128 到 127 之间,它会缓存 请在下面的链接中找到更多信息

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html


m
melpomene

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

您的代码与

int abc = new Integer(123);

s
shuaihanhungry

公共静态整数 valueOf(String s)

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


佚名

在 ValueOf -> 的情况下,它正在创建一个 Integer 对象。不是原始类型,也不是静态方法。在 ParseInt.ParseFloat -> 的情况下,它返回各自的原始类型。并且是一个静态方法。

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