==
so sánh địa chỉ của các đối tượng/dây/bất cứ điều gì
.equals()
thiết kế để sử dụng trạng thái nội bộ của đối tượng để so sánh.
Vì vậy:
new Object() == new Object() => false
- hai đối tượng riêng biệt tại các địa chỉ khác nhau trong bộ nhớ.
new String("a") == new String("a") => false
- cùng một tình huống - hai địa chỉ riêng biệt cho các đối tượng chuỗi.
new String("a").equals(new String("a")) => true
- địa chỉ khác nhau, nhưng Java sẽ lấy một trạng thái đối tượng ('a') và so sánh với trạng thái đối tượng khác ('a') sẽ thấy chúng bằng nhau và sẽ báo cáo đúng.
Sử dụng phương thức equals() bạn có thể mã so sánh bất kỳ cách nào phù hợp với chương trình của bạn.
intern()
là một câu chuyện khác. Nó được thiết kế để trả về cùng một đối tượng (địa chỉ) cho cùng một chuỗi char. Nó rất hữu ích để giảm số lượng bộ nhớ cần thiết khi bạn có cùng một chuỗi xây dựng nhiều lần.
new String("aaa").intern()
sẽ tìm trong bộ nhớ máy nếu bao giờ ai đó tạo chuỗi "aaa" trước và sẽ trả về phiên bản đầu tiên của chuỗi ... Nếu không được tìm thấy - chuỗi hiện tại sẽ được nhập vào danh sách đầu tiên và tất cả "aaa" .intern() và mới String("aaa").intern()
và ("a"+"aa").intern()
sẽ trả về phiên bản "đầu tiên" đó.
Hãy coi chừng: "aaa".intern()
không hoạt động rất nhanh và nếu bạn sẽ thực hiện tất cả các chuỗi - bạn sẽ tiết kiệm được một số bộ nhớ, nhưng sẽ mất khá nhiều công việc CPU.
Nguồn
2012-10-21 21:09:20
Ngoài lớp 'Object', điều tương tự cũng xảy ra với lớp mà chúng ta tạo ra. Tại sao? Nó có sử dụng phương thức lớp 'Object' không? – Tiny
@Tiny Nếu bạn không ghi đè 'bằng' trong lớp, nó sẽ kế thừa phương thức 'equals' của Object. – assylias
@Tiny Bởi vì mọi lớp học đều xuất phát từ Object. Bạn nên ghi đè các phương thức 'equals()' và 'hashCode()' cho các lớp của riêng bạn, nếu không chúng sẽ sử dụng các phương thức của lớp 'Object'. – ppeterka