này hoạt động quá ("trên máy tính của tôi"):
Integer a = 128, b = 128;
trong khi điều này sẽ không làm việc:
Integer a = 127, b = 127;
Auto-boxing một int
là cú pháp đường cho một cuộc gọi đến Integer.valueOf(int)
. Hàm này sử dụng bộ nhớ cache cho các giá trị từ -128 đến 127, bao gồm. Nó có thể bộ nhớ cache giá trị khác, nhưng trong trường hợp của tôi, nó không.
Do đó, việc gán 128 không có lần truy cập bộ nhớ cache; nó tạo ra một cá thể Integer
mới với mỗi thao tác tự động đấm bốc và so sánh tham chiếu a != b
là đúng sự thật. Nhiệm vụ 127 có một lần truy cập bộ nhớ cache và các đối tượng Integer
kết quả thực sự là cùng một ví dụ từ bộ nhớ cache. Vì vậy, so sánh tham chiếu a != b
là sai.
Điều tôi thực sự muốn chỉ ra là phải cẩn thận so sánh tham chiếu với tự động đấm bốc. Một vấn đề có thể xảy ra trong thế giới thực là bạn mong đợi a == b
là true vì chúng được gán cùng giá trị (được tự động đóng), bạn chạy một số kiểm tra đơn vị xác nhận kỳ vọng của bạn, và sau đó mã của bạn bị lỗi "trong tự nhiên" khi một số bộ đếm vượt quá giới hạn trên của bộ nhớ cache. Thời gian vui vẻ!
tôi ở đâu? .... – Kasturi
@DJClayworth ý bạn là gì bởi phiên bản "' || "?" –
@ Alan, rất tốt câu hỏi +1 – ELAYARAJA