- valueOf - chuyển đổi sang lớp Wrapper
- parseInt - chuyển đổi sang kiểu nguyên thủy
Integer.parseInt chỉ chấp nhận Chuỗi và trả về kiểu nguyên nguyên (int).
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
Iteger.valueOf chấp nhận int và String. Nếu giá trị là String, valueOf chuyển đổi nó thành int đơn giản bằng cách sử dụng parseInt và trả về Integer mới nếu đầu vào nhỏ hơn -128 hoặc lớn hơn 127. Nếu đầu vào nằm trong phạm vi (-128 - 127), nó luôn trả về các đối tượng Integer từ một IntegerCache nội bộ. Lớp Integer duy trì một lớp IntegerCache tĩnh bên trong, đóng vai trò là bộ đệm và giữ các đối tượng nguyên từ -128 đến 127 và đó là lý do tại sao khi chúng ta cố gắng lấy đối tượng số nguyên cho 127 (ví dụ), chúng ta luôn nhận được cùng một đối tượng.
Iteger.valueOf(200)
sẽ cung cấp cho Integer mới từ 200. Nó new Integer(200)
Iteger.valueOf(127)
giống như Integer = 127
;
Nếu bạn không chuyển đổi String sang Integer, hãy sử dụng Iteger.valueOf
.
Nếu bạn không chuyển đổi String sang sử dụng int đơn giản Integer.parseInt
. Nó hoạt động nhanh hơn.
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() {}
}
Và so sánh Integer.valueOf (127) == Integer.valueOf (127) trả về 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
Bởi vì nó lấy các đối tượng Integer có cùng tham chiếu từ bộ đệm.
Nhưng Integer.valueOf (128) == Integer.valueOf (128) là sai, vì 128 nằm ngoài phạm vi IntegerCache và nó trả về Integer mới, do đó các đối tượng sẽ có các tham chiếu khác nhau.