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

发布于 2024-07-13 01:53:39 字数 232 浏览 6 评论 0原文

parseInt()valueOf() 有何不同?

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

另外,按照惯例,其中哪一个更可取并且更常用?

How is parseInt() different from valueOf() ?

They appear to do exactly the same thing to me (also goes for parseFloat(), parseDouble(), parseLong() etc, how are they different from Long.valueOf(string) ?

Also, which one of these is preferable and used more often by convention?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

狂之美人 2024-07-20 01:53:40

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

The parse* variations return primitive types and the valueOf versions return Objects. I believe the valueOf versions will also use an internal reference pool to return the SAME object for a given value, not just another instance with the same internal value.

醉生梦死 2024-07-20 01:53:40

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

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

If you check the Integer class you will find that valueof call parseInt method. The big difference is caching when you call valueof API . It cache if the value is between -128 to 127 Please find below the link for more information

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

甩你一脸翔 2024-07-20 01:53:40

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

你的代码是一样的

int abc = new Integer(123);

Because you might be using jdk1.5+ and there it is auto converting to int. So in your code its first returning Integer and then auto converted to int.

your code is same as

int abc = new Integer(123);
谁把谁当真 2024-07-20 01:53:40

public static Integer valueOf(String s)

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

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

public static Integer valueOf(String s)

  1. The argument is interpreted as representing a signed decimal integer, exactly as if the argument were given to the parseInt(java.lang.String) method.
  2. The result is an Integer object that represents the integer value specified by the string.

  3. In other words, this method returns an Integer object equal to the value of:
    new Integer(Integer.parseInt(s))

夏花。依旧 2024-07-20 01:53:40
  1. 如果是 ValueOf -> 它正在创建一个 Integer 对象。 不是原始类型,也不是静态方法。
  2. 如果是 ParseInt.ParseFloat -> 它返回各自的原始类型。 并且是一个静态方法。

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

  1. In case of ValueOf -> it is creating an Integer object. not a primitive type and not a static method.
  2. In case of ParseInt.ParseFloat -> it return respective primitive type. and is a static method.

We should use any one depending upon our need. In case of ValueOf as it is instantiating an object. it will consume more resources if we only need value of some text then we should use parseInt,parseFloat etc.

叶落知秋 2024-07-20 01:53:39

好吧,Integer.valueOf(String) 确实表示 String 的解释完全就像它被赋予 Integer.parseInt(String)< /a>. 但是,valueOf(String) 返回一个 new Integer() 对象,而 parseInt(String)< /code> 返回一个原始的 int

如果您想享受 Integer.valueOf(int),你也可以使用这个碍眼的东西:

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

现在,如果你想要的是对象而不是基元,那么使用 valueOf(String) 可能比用 parseInt(String) 创建新对象更有吸引力,因为前者始终存在于 IntegerLong 中、等。

Well, the API for Integer.valueOf(String) does indeed say that the String is interpreted exactly as if it were given to Integer.parseInt(String). However, valueOf(String) returns a new Integer() object whereas parseInt(String) returns a primitive int.

If you want to enjoy the potential caching benefits of Integer.valueOf(int), you could also use this eyesore:

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

Now, if what you want is the object and not the primitive, then using valueOf(String) may be more attractive than making a new object out of parseInt(String) because the former is consistently present across Integer, Long, Double, etc.

欲拥i 2024-07-20 01:53:39

来自此论坛:

parseInt() 返回原始整数
类型 (int),其中 valueOf 返回
java.lang.Integer,这是对象
代表整数。 那里
是您可能想要的情况
一个 Integer 对象,而不是
原始类型。

当然,还有一个明显的区别
intValue 是一个实例方法
其中 parseInt 是一个静态方法。

From this forum:

parseInt() returns primitive integer
type (int), whereby valueOf returns
java.lang.Integer, which is the object
representative of the integer. There
are circumstances where you might want
an Integer object, instead of
primitive type.

Of course, another obvious difference
is that intValue is an instance method
whereby parseInt is a static method.

暖心男生 2024-07-20 01:53:39
Integer.valueOf(s)

valueOf()类似,区别

new Integer(Integer.parseInt(s))

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

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

Integer.valueOf(s)

is similar to

new Integer(Integer.parseInt(s))

The difference is valueOf() returns an Integer, and parseInt() returns an int (a primitive type). Also note that valueOf() can return a cached Integer instance, which can cause confusing results where the result of == tests seem intermittently correct. Before autoboxing there could be a difference in convenience, after java 1.5 it doesn't really matter.

Moreover, Integer.parseInt(s) can take primitive datatype as well.

末が日狂欢 2024-07-20 01:53:39

查看 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);
}

Look at Java sources: valueOf is using 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 returns int (not 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);
}
寄与心 2024-07-20 01:53:39

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

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

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

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

Integer.parseInt can just return int as native type.

Integer.valueOf may actually need to allocate an Integer object, unless that integer happens to be one of the preallocated ones. This costs more.

If you need just native type, use parseInt. If you need an object, use valueOf.

Also, because of this potential allocation, autoboxing isn't actually good thing in every way. It can slow down things.

作死小能手 2024-07-20 01:53:39
  • valueOf - 转换为包装类
  • 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 对象。 Integer 类维护一个内部静态 IntegerCache 类,该类充当缓存并保存从 -128 到 127 的整数对象,这就是为什么当我们尝试获取 127 的整数对象(例如)时,我们总是得到相同的对象。

Iteger.valueOf(200) 将给出 200 的新 Integer。就像 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) 为 false,因为 128 超出了 IntegerCache 范围,并且它返回 new Integer,因此对象将具有不同的引用。

  • valueOf - converts to Wrapper class
  • parseInt - converts to primitive type

Integer.parseInt accept only String and return primitive integer type (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) will give new Integer from 200. It's like new Integer(200)
Iteger.valueOf(127) is the same as Integer = 127;

If you wont to convert String to the Integer use Iteger.valueOf.

If you wont to convert String to the simple int use Integer.parseInt. It works faster.

  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() {}
  }

And comparing Integer.valueOf(127) == Integer.valueOf(127) return 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 

Because it takes the Integer objects with the same references from the cache.

But Integer.valueOf(128) == Integer.valueOf(128) is false, because 128 is out of IntegerCache range and it return new Integer, so objects will have different references.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文