web-dev-qa-db-ja.com

javaのparseIntとvalueOfの違いは?

これら2つの方法の違いは何ですか?彼らは私と全く同じことをしているようです(parseFloat()parseDouble()parseLong()などにも当てはまります)。それらはLong.valueOf(string)とどう違うのですか?

編集:また、これらのうちどれが慣習的に好まれ、より頻繁に使用されていますか?

397
Click Upvote

まあ、 Integer.valueOf(String) のAPIは、実際にStringInteger.parseInt(String) に与えられたように正確に解釈されると言っています。ただし、valueOf(String)newInteger()オブジェクトを返しますが、parseInt(String)はプリミティブなintを返します。

Integer.valueOf(int) の潜在的なキャッシュの利点を享受したい場合は、この目障りなものを使用することもできます。

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

プリミティブではなくオブジェクトが必要な場合、valueOf(String)を使用する方がparseInt(String)から新しいオブジェクトを作成するよりも魅力的です。前者はIntegerLongDoubleなどに一貫して存在するためです。

380
Zach Scrivena

から このフォーラム

parseInt()は、プリミティブ整数型(int)を返します。valueOfJava.lang.Integerを返します。これは整数を表すオブジェクトです。プリミティブ型の代わりにIntegerオブジェクトが必要な場合があります。

もちろん、もう1つの明らかな違いは、intValueparseIntのインスタンスメソッドであることです。 )は静的メソッドです。

67
Michael Haren
Integer.valueOf(s)

と類似しています

new Integer(Integer.parseInt(s))

違いはvalueOf()Integerを返し、parseInt()int(プリミティブ型)を返すことです。また、valueOf()はキャッシュされたIntegerインスタンスを返す可能性があるため、==テストの結果が断続的に正しいように見える混乱を招く可能性があります。 autoboxing 以前のバージョンでは、利便性に違いがあるかもしれませんが、Java 1.5以降ではそれは問題ではありません。

さらに、Integer.parseInt(s)はプリミティブデータ型も取ることができます。

35
Joao da Silva

Javaソースを見てください。valueOfparseIntを使用しています。

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

parseIntintを返します

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

Integer.parseIntはネイティブタイプとしてintを返すことができます。

Integer.valueOfは、その整数が偶然に事前割り当てされたものの1つでない限り、実際にはIntegerオブジェクトを割り当てる必要があるかもしれません。これはもっとかかります。

ネイティブ型だけが必要な場合は、parseIntを使用してください。オブジェクトが必要な場合は、valueOfを使用してください。

また、この潜在的な割り当てのために、オートボクシングは実際にはあらゆる点で良いことではありません。それは物事を遅くすることができます。

5
iny

Jdk1.5 +を使用している可能性があり、そこからintへの自動変換が行われます。そのため、あなたのコードでは最初にIntegerを返し、次にintに自動変換されます。

あなたのコードは

int abc = new Integer(123);
2
MAR

Parse *バリエーションはプリミティブ型を返し、valueOfバージョンはObjectsを返します。私は、valueOfバージョンも、同じ内部値を持つ別のインスタンスではなく、特定の値のSAMEオブジェクトを返すために内部参照プールを使用すると考えています。

1
basszero

Integer.parseIntはStringのみを受け入れ、プリミティブ整数型(int)を返します。

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

Iteger.valueOfはintとStringを受け入れます。 valueがStringの場合、parseIntを使用してそれを単純なintに変換し、inputが-128未満または127より大きい場合はnew Integerを返します。inputが範囲(-128 - 127)内にある場合、常にIntegerオブジェクトを返します。内部IntegerCache。 Integerクラスは、キャッシュとして機能し、-128から127までの整数オブジェクトを保持する内部静的IntegerCacheクラスを維持します。したがって、127の整数オブジェクトを取得しようとすると(たとえば)、常に同じオブジェクトが取得されます。

Int 200から新しいIntegerを取得したくない場合は、Iteger.valueOf(200)を使用します。Iteger.valueOf(127)は意味がありません。Integer= 127と同じです。

たとえばStringを新しいIntegerまたは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が返されるため、オブジェクトは異なる参照を持つことになります。

0
Andriy

Integerクラスをチェックすると、parseIntメソッドを呼び出すとその値がわかります。大きな違いは、valueof APIを呼び出したときのキャッシュです。値が-128〜127の場合はキャッシュします。詳細については、リンクの下を参照してください。

http://docs.Oracle.com/javase/7/docs/api/Java/lang/Integer.html

0
Anuj Kumar Jha

public static Integer valueOf(String s)

  1. 引数は、引数がparseInt(Java.lang.String)メソッドに渡された場合とまったく同じように、符号付き10進整数を表すものとして解釈されます。
  2. 結果は、文字列で指定された整数値を表すIntegerオブジェクトです。

  3. つまり、このメソッドは、次の値に等しいIntegerオブジェクトを返します。new Integer(Integer.parseInt(s))

0
shuaihanhungry

ValueOfは新しいIntegerオブジェクトを返すので、なぜ以下のコードは正しいのでしょうか。

String base5String = "230";
int result = Integer.valueOf(base5String);
0
curious