câu trả lời của bộ công cụ ở trên là chính xác và tốt nhất, nhưng nó không giải thích đầy đủ về những gì đang xảy ra. Giả Java 5 hoặc mới hơn:
Integer a = new Integer(2); // or even just Integer a = 2;
a *= 10;
System.out.println(a); // will output 20
Những gì bạn cần phải biết là điều này là chính xác giống như thực hiện:
Integer a = new Integer(2); // or even just Integer a = 2;
a = a.intValue() * 10;
System.out.println(a.intValue()); // will output 20
Bằng cách thực hiện các hoạt động (trong trường hợp này * =) trên đối tượng 'a', bạn không thay đổi giá trị int bên trong đối tượng 'a', nhưng thực sự gán một đối tượng mới cho 'a'. Điều này là do 'a' được tự động unboxed để thực hiện phép nhân, và sau đó kết quả của phép nhân được tự động đóng hộp và gán cho 'a'.
Số nguyên là một đối tượng bất biến. (Tất cả các lớp wrapper là không thay đổi.)
Đưa ví dụ đoạn mã này:
static void test() {
Integer i = new Integer(10);
System.out.println("StartingMemory: " + System.identityHashCode(i));
changeInteger(i);
System.out.println("Step1: " + i);
changeInteger(++i);
System.out.println("Step2: " + i.intValue());
System.out.println("MiddleMemory: " + System.identityHashCode(i));
}
static void changeInteger(Integer i) {
System.out.println("ChangeStartMemory: " + System.identityHashCode(i));
System.out.println("ChangeStartValue: " + i);
i++;
System.out.println("ChangeEnd: " + i);
System.out.println("ChangeEndMemory: " + System.identityHashCode(i));
}
Kết quả sẽ là:
StartingMemory: 1373539035
ChangeStartMemory: 1373539035
ChangeStartValue: 10
ChangeEnd: 11
ChangeEndMemory: 190331520
Step1: 10
ChangeStartMemory: 190331520
ChangeStartValue: 11
ChangeEnd: 12
ChangeEndMemory: 1298706257
Step2: 11
MiddleMemory: 190331520
Bạn có thể xem địa chỉ bộ nhớ cho 'i' là thay đổi (địa chỉ bộ nhớ của bạn sẽ khác nhau).
Bây giờ cho phép làm một thử nghiệm nhỏ với suy nghĩ, thêm này vào phần cuối của bài kiểm tra() phương pháp:
System.out.println("MiddleMemory: " + System.identityHashCode(i));
try {
final Field f = i.getClass().getDeclaredField("value");
f.setAccessible(true);
f.setInt(i, 15);
System.out.println("Step3: " + i.intValue());
System.out.println("EndingMemory: " + System.identityHashCode(i));
} catch (final Exception e) {
e.printStackTrace();
}
Các công suất tăng thêm sẽ là:
MiddleMemory: 190331520
Step2: 15
MiddleMemory: 190331520
Bạn có thể thấy rằng địa chỉ bộ nhớ cho 'i' không thay đổi, mặc dù chúng tôi đã thay đổi giá trị của nó bằng cách sử dụng sự phản chiếu.
(KHÔNG SỬ DỤNG LỰA CHỌN CÁCH NÀY TRONG CUỘC SỐNG THỰC HIỆN !!)
Tôi cũng khuyên bạn nên kiểm tra xem có sử dụng Integer là REALLY cần thiết hay không. Joshua chỉ ra rằng việc sử dụng nguyên thủy nhanh hơn MANY MANY lần trong Java hiệu quả. Vì vậy, nếu bạn có thể, hãy gắn bó với ** int **. –
Sử dụng Integer thực sự là một ràng buộc thiết kế. Ý tưởng là tôi nhận được một đối tượng Integer và tôi phải cập nhật điều đó. Vì vậy, không thể làm điều đó :) – Jagmal