Answers:
好吧,for的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
,这正是它的作用。当说返回“ new”时,此答案也部分不正确Integer
。那不是Javadoc中所说的。可以免费返回已缓存Integer
。
从这个论坛:
parseInt()
返回原始整数类型(int),从而valueOf
返回 java.lang.Integer,它是表示整数的对象。在某些情况下,您可能需要Integer对象而不是原始类型。当然,另一个明显的区别是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);
}
如果检查Integer类,则将找到调用parseInt方法的valueof。调用API的值时,最大的区别是缓存。如果值介于-128到127之间,则会缓存它。有关更多信息,请在下面的链接中找到
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
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类维护一个内部静态IntegerCache类,该类充当缓存并保存从-128到127的整数对象,这就是为什么当我们尝试获取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等。