JavaのparseInt()とvalueOf()の違いは?


443

どうparseInt()違うのvalueOf()

彼らはまたのために行く(私にはまったく同じことを行うように見えるparseFloat()parseDouble()parseLong()彼らは異なっているか、などLong.valueOf(string)

また、これらのうちどれが好ましく、慣例により頻繁に使用されますか?

回答:


411

まあ、の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
2つのアプローチの間にパフォーマンスまたはメモリの違いはありますか?
Logan、

90
Integer.valueOf(Integer.parseInt("123"))以上の何のメリットがないInteger.valueOf("123")か、Integer.valueOf(123)脇無駄サイクルからして、プログラムのサイズを。
Thomas Eding、

9
違いがあります。通常のintは非常に「軽量」ですが、valueOfによって(潜在的に)割り当てられる新しいオブジェクトにはオーバーヘッド(オブジェクトのメモリ、処理、GC)が伴います。(最も一般的な値については、既存のオブジェクトへの参照を取得します。これは、ほんの少し役立ちます。)
foo

14
Integer.valueOf(String)とまったく同じキャッシングを行いInteger.valueOf(int)ます。実際、これはInteger.valueOf(Integer.parseInt(…))
Holger

11
@Khezプリミティブを返すことは不可能ですint。署名はそれがを返すと言ってIntegerおり、それはまさにそれがすることです。この回答は、「新しい」が返されると部分的に間違っていますInteger。それはJavadocでそれが言っていることではありません。キャッシュされたを自由に返すことができIntegerます。
ローン侯爵2015

73

このフォーラムから:

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

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


9
言及する価値がある:valueOfバージョンは、内部参照プールを使用して、同じ内部値を持つ別のインスタンスだけでなく、指定された値のSAMEオブジェクトを返します。つまり、この方法で2つのLongが返された場合、a.equals(b)== trueであり、a == bはtrueです
basszero

さらに下で証明されているように、あなたは文字列バージョンに適しています。私はプリミティブバージョンについて考えていました。Long.valueOf(5)は常に同じオブジェクトを返します。文字列バージョンは新しいオブジェクトを返し、プリミティブバージョンは同じオブジェクトを返します
basszero

1
@bassezero。また、そのプールには制限があります。私はそれが-127〜127だったと思う
OscarRyzを

1
参照プールのサイズは、実装の詳細の真の例です。パッチリリースではサイズを大きくすることもできますが、決してそれに依存するべきではありません。
ドナルフェロー

@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までの引数の場合は必須です)。new Integer()は常に新しいオブジェクトを作成します。
Adam Rosenfield、

どちらがより頻繁に使用されますか?どれを使うべきですか?
2009

3
intが必要な場合はparseInt()を使用し、Integerが必要な場合は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バージョンはオブジェクトを返します。valueOfバージョンも内部参照プールを使用して、同じ内部値を持つ別のインスタンスだけでなく、指定された値のSAMEオブジェクトを返すと思います。


実際には、そうではありません。私は最初はそう思っていましたが、Integer.valueOf(String)のJavadocは、それがnew Integer(Integer.parseInt(String))と同等であると明確に述べています。ただし、Integer.valueOf(int)は実際にキャッシュを行います。
マイケル・マイヤーズ

あなたは文字列バージョンに正解です。私はプリミティブバージョンを考えていました。Long.valueOf(5)は常に同じオブジェクトを返します。
basszero

1

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

あなたのコードは同じです

int abc = new Integer(123);


0

public static Integer valueOf(String s)

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

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


0
  • valueOf -Wrapperクラスに変換します
  • parseInt-プリミティブ型に変換します

Integer.parseIntは文字列のみを受け入れ、プリミティブ整数型(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)の場合、常にIntegerオブジェクトを内部IntegerCache。Integerクラスは、キャッシュとして機能し、-128から127までの整数オブジェクトを保持する内部静的IntegerCacheクラスを維持します。そのため、たとえば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などを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.