Nó tương đương nhưng không giống nhau. Nói một cách đơn giản, nếu một biểu thức lambda không nắm bắt được các giá trị, nó sẽ là một singleton được sử dụng lại trên mỗi lệnh gọi.
Hành vi không được chỉ định chính xác. JVM được tự do lớn về cách triển khai nó. Hiện tại, JVM của Oracle tạo (ít nhất) một thể hiện cho mỗi biểu thức lambda (nghĩa là không chia sẻ thể hiện giữa các biểu thức giống hệt nhau khác nhau) nhưng tạo ra các singletons cho tất cả các biểu thức không thu được giá trị.
Bạn có thể đọc câu trả lời này để biết thêm chi tiết. Ở đó, tôi không chỉ đưa ra một mô tả chi tiết hơn mà còn kiểm tra mã để quan sát hành vi hiện tại.
Điều này được đề cập trong Đặc tả ngôn ngữ Java®, chương 15,27.4. Run-time Đánh giá Lambda Expressions ”
Tóm tắt:
Các quy tắc này nhằm cung cấp tính linh hoạt cho việc triển khai ngôn ngữ lập trình Java, theo đó:
Một đối tượng mới không cần phải được phân bổ trên mỗi đánh giá.
Các đối tượng được tạo bởi các biểu thức lambda khác nhau không cần phải thuộc các lớp khác nhau (ví dụ: nếu các cơ thể giống hệt nhau).
Mọi đối tượng được tạo ra bởi đánh giá không cần thuộc về cùng một lớp (ví dụ, các biến cục bộ có thể được nội tuyến).
Nếu một "thể hiện hiện tại" có sẵn, thì nó không cần phải được tạo ra trong một đánh giá lambda trước đó (ví dụ, nó có thể đã được phân bổ trong quá trình khởi tạo của lớp kèm theo).