Trong Java hiệu quả của Joshua Bloch , Mục 5: "Tránh tạo các đối tượng không cần thiết", anh ta đăng ví dụ mã sau:
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
và phải mất 43 giây để chạy. Đưa Long vào nguyên thủy sẽ giảm xuống còn 6,8 giây ... Nếu đó là bất kỳ dấu hiệu nào cho thấy tại sao chúng ta sử dụng nguyên thủy.
Sự thiếu bình đẳng giá trị bản địa cũng là một mối quan tâm ( .equals()
khá dài dòng so với==
)
cho biziclop:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
Kết quả trong:
false
false
true
false
EDIT Tại sao (3) trở lại true
và (4) trở lại false
?
Bởi vì chúng là hai đối tượng khác nhau. 256 số nguyên gần nhất với 0 [-128; 127] được lưu trữ bởi JVM, vì vậy chúng trả về cùng một đối tượng cho các đối tượng đó. Tuy nhiên, ngoài phạm vi đó, chúng không được lưu trong bộ nhớ cache, do đó, một đối tượng mới được tạo. Để làm cho mọi thứ phức tạp hơn, JLS yêu cầu ít nhất 256 bánh đà được lưu trữ. Những người triển khai JVM có thể bổ sung thêm nếu họ muốn, có nghĩa là điều này có thể chạy trên một hệ thống có 1024 bộ nhớ cache gần nhất và tất cả chúng đều trả về đúng ... #awkward