Hai bản đồ bằng nhau nếu cùng một khóa ánh xạ với cùng một giá trị. (Trong một số triển khai.) Vì vậy, để kiểm tra bình đẳng, bình đẳng của mỗi thành viên cần được kiểm tra.
Do đó, nếu bản đồ chứa chính nó, bạn sẽ nhận được một lần truy cập vô hạn kiểm tra bình đẳng.
Điều tương tự cũng xảy ra đối với băm, vì chúng có thể được tính phụ thuộc vào giá trị băm của các phần tử trong bản đồ.
Ví dụ:
Map<Int, Object> ma;
Map<Int, Object> mb;
Map<Int, Object> mc;
ma.put(1, ma);
ma.put(2, mb);
mc.put(1, ma);
mc.put(2, mb);
Là một con người, chúng ta có thể thấy ma
và mc
đều bình đẳng từ định nghĩa. Một máy tính sẽ thấy 2 bản đồ trên mb (một bản đồ trống) trong cả hai bản đồ, đó là tốt. Nó sẽ thấy 1 bản đồ trên bản đồ khác trong cả mc và ma. Nó sẽ kiểm tra xem các bản đồ này có bình đẳng không. Để xác định điều này, nó sẽ kiểm tra lại nếu hai giá trị cho 1 bằng. Và một lần nữa.
Lưu ý rằng đây không phải là trường hợp cho tất cả các triển khai. Một số triển khai có thể kiểm tra sự bình đẳng trên vị trí trong bộ nhớ đối tượng được lưu, ... Nhưng mọi kiểm tra đệ quy sẽ lặp vô hạn.
nếu tôi nhớ chính xác phương pháp bằng kiểm tra nếu nội dung của bản đồ bằng nhau. và điều này được thực hiện bằng cách sử dụng phương thức equals của nội dung, tức là bản thân bản đồ. Tôi khá chắc chắn chúng tôi kết thúc với một StackOverflowError –
Có thể là cách một bản đồ bằng chức năng trông? có lẽ nó sẽ gây ra một vòng lặp vô hạn? Chỉ cần một ý nghĩ – Kevin
@MarcoForberg Nếu tôi nhớ chính xác, cách tốt nhất là kiểm tra xem đối tượng mà bạn so sánh có thực sự là chính bạn và trả về true ngay lập tức nếu có. –