これら2つの方法の違いは何ですか?彼らは私と全く同じことをしているようです(parseFloat()
、parseDouble()
、parseLong()
などにも当てはまります)。それらはLong.valueOf(string)
とどう違うのですか?
編集:また、これらのうちどれが慣習的に好まれ、より頻繁に使用されていますか?
まあ、 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)
から新しいオブジェクトを作成するよりも魅力的です。前者はInteger
、Long
、Double
などに一貫して存在するためです。
から このフォーラム :
parseInt()
は、プリミティブ整数型(int)を返します。valueOf
はJava.lang.Integerを返します。これは整数を表すオブジェクトです。プリミティブ型の代わりにIntegerオブジェクトが必要な場合があります。もちろん、もう1つの明らかな違いは、intValueはparseIntのインスタンスメソッドであることです。 )は静的メソッドです。
Integer.valueOf(s)
と類似しています
new Integer(Integer.parseInt(s))
違いはvalueOf()
はInteger
を返し、parseInt()
はint
(プリミティブ型)を返すことです。また、valueOf()
はキャッシュされたInteger
インスタンスを返す可能性があるため、==
テストの結果が断続的に正しいように見える混乱を招く可能性があります。 autoboxing 以前のバージョンでは、利便性に違いがあるかもしれませんが、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);
}
Integer.parseIntはネイティブタイプとしてintを返すことができます。
Integer.valueOfは、その整数が偶然に事前割り当てされたものの1つでない限り、実際にはIntegerオブジェクトを割り当てる必要があるかもしれません。これはもっとかかります。
ネイティブ型だけが必要な場合は、parseIntを使用してください。オブジェクトが必要な場合は、valueOfを使用してください。
また、この潜在的な割り当てのために、オートボクシングは実際にはあらゆる点で良いことではありません。それは物事を遅くすることができます。
Jdk1.5 +を使用している可能性があり、そこからintへの自動変換が行われます。そのため、あなたのコードでは最初にIntegerを返し、次にintに自動変換されます。
あなたのコードは
int abc = new Integer(123);
Parse *バリエーションはプリミティブ型を返し、valueOfバージョンはObjectsを返します。私は、valueOfバージョンも、同じ内部値を持つ別のインスタンスではなく、特定の値のSAMEオブジェクトを返すために内部参照プールを使用すると考えています。
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が返されるため、オブジェクトは異なる参照を持つことになります。
Integerクラスをチェックすると、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))
ValueOfは新しいIntegerオブジェクトを返すので、なぜ以下のコードは正しいのでしょうか。
String base5String = "230";
int result = Integer.valueOf(base5String);