Đang cố gắng để nói lại những gì người khác đã nói một cách rõ ràng hơn:
Vấn đề với sum
là L ong là một tham khảo loại; nói cách khác, đó là một loại Object. Đối tượng sống trên heap; chúng được tạo ra (sử dụng "mới" và một hàm tạo) bởi JVM và "được quản lý" bởi bộ thu gom rác.
Tính năng tự động đấm cho phép bạn sử dụng biến Long kiểu tham chiếu đó giống như cách bạn sử dụng biến dài kiểu nguyên thủy.
Nhưng đối tượng Long không thể thay đổi được; một khi được tạo, giá trị của nó không bao giờ có thể thay đổi. Nhưng toàn bộ vòng lặp là liên tục thay đổi một giá trị (bằng cách tăng bộ đếm)! Vì vậy, để tăng bộ đếm, bạn phải lấy giá trị của đối tượng Long "hiện tại"; thêm 1; và thứ đó vào đối tượng Long tiếp theo. Một lần nữa, và một lần nữa, ...
Vì vậy, những gì chương trình của bạn đang làm ở đây là: tạo rác mọi lúc. Nói cách khác: những đối tượng Long được tạo; sử dụng một lần (để lấy giá trị của chúng); và sau đó chúng bị "quên" (vì không có tham chiếu đến chúng được giữ ở bất kỳ đâu). Vì vậy, họ ngay lập tức đủ điều kiện để thu gom rác .
Ý nghĩa: có thực sự là hai ảnh hưởng đến hiệu suất ở đây:
- tạo đối tượng không cần thiết [mà là khá rẻ trong Java, nhưng vẫn "đắt hơn" so với tính toán đơn giản trên một giá trị lâu; sau đó có lẽ chỉ là một, hai hướng dẫn CPU; trong khi tạo đối tượng sẽ dẫn đến truy cập bộ nhớ và một số hoạt động của CPU! ]
- Tạo tốc độ cao các đối tượng cần phải được thu gom rác.
Vì chúng không thay đổi. – tkausl
tổng là một Long, vì vậy như @tkausl cho biết, nó là bất biến. Vì vậy, sum + = tôi giữ tái tạo các đối tượng Long mới. – FredK
'sum = sum + 1' cũng có cùng tác dụng phụ. Nó sẽ tạo ra một giá trị đóng hộp mới mỗi khi nó thực thi. –