どうparseInt()
違うのvalueOf()
?
彼らはまたのために行く(私にはまったく同じことを行うように見えるparseFloat()
、parseDouble()
、parseLong()
彼らは異なっているか、などLong.valueOf(string)
?
また、これらのうちどれが好ましく、慣例により頻繁に使用されますか?
どうparseInt()
違うのvalueOf()
?
彼らはまたのために行く(私にはまったく同じことを行うように見えるparseFloat()
、parseDouble()
、parseLong()
彼らは異なっているか、などLong.valueOf(string)
?
また、これらのうちどれが好ましく、慣例により頻繁に使用されますか?
回答:
まあ、の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)
前者は全体で一貫して存在しているのでInteger
、Long
、Double
、など
Integer.valueOf(Integer.parseInt("123"))
以上の何のメリットがないInteger.valueOf("123")
か、Integer.valueOf(123)
脇無駄サイクルからして、プログラムのサイズを。
Integer.valueOf(String)
とまったく同じキャッシングを行いInteger.valueOf(int)
ます。実際、これはInteger.valueOf(Integer.parseInt(…))
…
int
。署名はそれがを返すと言ってInteger
おり、それはまさにそれがすることです。この回答は、「新しい」が返されると部分的に間違っていますInteger
。それはJavadocでそれが言っていることではありません。キャッシュされたを自由に返すことができInteger
ます。
このフォーラムから:
parseInt()
プリミティブ整数型(int)をvalueOf
返します。これにより、整数を表すオブジェクトであるjava.lang.Integerが返され ます。プリミティブ型ではなくIntegerオブジェクトが必要になる場合があります。もちろん、もう1つの明らかな違いは、intValueがインスタンスメソッドであり、parseIntが静的メソッドであることです。
Integer.valueOf(s)
と類似しています
new Integer(Integer.parseInt(s))
違いはvalueOf()
戻りInteger
、そしてparseInt()
リターンするint
(プリミティブ型)。はvalueOf()
、キャッシュされたInteger
インスタンスを返す可能性があることにも注意してください。これにより、==
テストの結果が断続的に正しいように見えて、混乱する結果になる可能性があります。オートボクシングの前は利便性に違いがある可能性がありますが、Java 1.5以降は問題になりません。
さらに、Integer.parseInt(s)
プリミティブデータ型も使用できます。
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);
}
parse *バリエーションはプリミティブ型を返し、valueOfバージョンはオブジェクトを返します。valueOfバージョンも内部参照プールを使用して、同じ内部値を持つ別のインスタンスだけでなく、指定された値のSAMEオブジェクトを返すと思います。
Integerクラスをチェックすると、valueof呼び出しのparseIntメソッドが見つかります。大きな違いは、valueof APIを呼び出すときのキャッシュです。値が-128から127の間の場合、キャッシュします。詳細については、リンクの下をご覧ください
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
public static Integer valueOf(String s)
結果は、文字列で指定された整数値を表すIntegerオブジェクトです。
つまり、このメソッドは次の値に等しいIntegerオブジェクトを返します:new Integer(Integer.parseInt(s))
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を返すため、オブジェクトは異なる参照を持つためです。
必要に応じて使い分けてください。オブジェクトをインスタンス化するValueOfの場合。一部のテキストの値だけが必要な場合は、より多くのリソースを消費します。次に、parseInt、parseFloatなどを使用する必要があります。