So sánh các chuỗi trọng java năm 2024
Thật hợp lý khi kết quả vẫn như vậy (xét cho cùng, chúng tôi không thay đổi gì cả), nhưng giờ chúng tôi không hài lòng với nó! Quả thực, trong đời thực, phân tích DNA đảm bảo một trăm phần trăm rằng chúng ta đang đối mặt với những cặp song sinh. Nhưng chương trình và nhà điều hành của chúng tôi
Show 4lại cho chúng tôi biết điều ngược lại. Làm cách nào chúng ta có thể thay đổi hành vi này và đảm bảo rằng nếu kết quả xét nghiệm ADN trùng khớp thì chương trình sẽ đưa ra kết quả chính xác? Với mục đích này, một phương thức đặc biệt đã được tạo trong Java - Equals() . Phương thức Equals() trong JavaGiống như phương thức
9mà chúng ta đã thảo luận trước đó, Equals() thuộc về lớp,
0lớp quan trọng nhất trong Java, mà tất cả các lớp khác đều bắt nguồn từ đó. Tuy nhiên, bản thân Equals() sẽ không thay đổi hành vi của chương trình theo bất kỳ cách nào:
Đầu ra của bảng điều khiển:
Kết quả hoàn toàn giống nhau, vậy tại sao lại cần phương pháp này? :/ Thật đơn giản. Thực tế là bây giờ chúng tôi đã sử dụng phương pháp này vì nó được triển khai trong chính lớp đó
0. Và nếu chúng ta đi vào mã lớp
0và xem phương thức này được triển khai như thế nào và nó làm gì, chúng ta sẽ thấy:
Đây là lý do tại sao hành vi của chương trình của chúng tôi không thay đổi! Bên trong phương thức Equals() của lớp
0có cùng một so sánh tham chiếu tương tự,
4. Nhưng mẹo của phương pháp này là chúng ta có thể ghi đè lên nó. Ghi đè có nghĩa là viết phương thức Equals() của riêng bạn trong lớp của chúng ta
5và làm cho nó hoạt động theo cách chúng ta muốn! Bây giờ chúng tôi không hài lòng rằng
6về cơ bản, việc kiểm tra cũng thực hiện giống như
7. Đây là những gì chúng ta sẽ làm trong tình huống này:
Đầu ra của bảng điều khiển:
Một kết quả hoàn toàn khác! Bằng cách viết phương thức Equals() của riêng mình thay vì phương thức tiêu chuẩn, chúng ta đã đạt được hành vi đúng: bây giờ nếu hai người có cùng mã DNA, chương trình sẽ cho chúng ta biết: “Phân tích DNA cho thấy họ là anh em sinh đôi” và trả về giá trị true! Bằng cách ghi đè phương thức bằng() trong các lớp của mình, bạn có thể dễ dàng tạo logic so sánh đối tượng cần thiết. Chúng tôi chỉ đề cập đến việc so sánh các đối tượng một cách chung chung. Chúng tôi vẫn sẽ có một bài giảng lớn riêng về chủ đề này ở phía trước (bạn có thể đọc nhanh ngay bây giờ nếu quan tâm). So sánh chuỗi trong Java - So sánh chuỗiTại sao chúng ta xử lý việc so sánh chuỗi một cách riêng biệt với mọi thứ khác? Thực ra, các dòng trong lập trình là một câu chuyện hoàn toàn khác. Thứ nhất, nếu bạn xem xét tất cả các chương trình Java do loài người viết ra, khoảng 25% đối tượng trong đó được tạo thành từ chúng. Vì vậy, chủ đề này là rất quan trọng. Thứ hai, quá trình so sánh các chuỗi thực sự khá khác biệt so với các đối tượng khác. Hãy xem một ví dụ đơn giản:
Đầu ra của bảng điều khiển:
Nhưng tại sao lại sai? Các dòng giống hệt nhau, từng chữ một :/ Bạn có thể cho rằng: điều này là do toán tử
4 so sánh các tham chiếu! Rốt cuộc,
9họ
0có địa chỉ khác nhau trong bộ nhớ. Nếu ý nghĩ này xảy ra với bạn, thì hãy làm lại ví dụ của chúng ta:
1 Bây giờ chúng ta cũng có 2 link nhưng kết quả lại ngược lại:
Hoàn toàn bối rối? :) Hãy tìm ra nó. Toán tử
4thực sự so sánh các địa chỉ trong bộ nhớ. Quy tắc này luôn hoạt động và không cần phải nghi ngờ gì về nó. Điều này có nghĩa là nếu
2trả về true thì hai chuỗi này có cùng địa chỉ trong bộ nhớ. Và thực sự là như vậy! Đã đến lúc làm quen với một vùng bộ nhớ đặc biệt để lưu trữ chuỗi - nhóm chuỗi (
4- một dòng có văn bản bạn cần được đặt ở đó và trong tương lai, các liên kết mới được tạo sẽ đề cập đến cùng một vùng bộ nhớ, không cần phải phân bổ thêm bộ nhớ mỗi lần. Mỗi lần bạn viết
5, chương trình sẽ kiểm tra xem có dòng nào có văn bản như vậy trong nhóm chuỗi hay không. Nếu có, một cái mới sẽ không được tạo ra. Và liên kết mới sẽ trỏ đến cùng một địa chỉ trong nhóm chuỗi nơi chuỗi này được lưu trữ. Vì vậy, khi viết chương trình
3 liên kết
0trỏ chính xác đến cùng một vị trí với
9. Lệnh đầu tiên đã tạo một dòng mới trong nhóm chuỗi với văn bản chúng ta cần và khi đến dòng thứ hai, nó chỉ đơn giản đề cập đến cùng một vùng bộ nhớ như
9. Bạn có thể viết thêm ít nhất 500 dòng với cùng một văn bản, kết quả sẽ không thay đổi. Dừng lại. Nhưng tại sao ví dụ này không có tác dụng với chúng ta trước đây?
Tôi nghĩ, bằng trực giác, bạn đã đoán được lý do là gì :) Hãy thử đoán trước khi đọc tiếp. Bạn có thể thấy hai dòng này được tạo ra khác nhau. Một là với sự trợ giúp của người vận hành
9, và thứ hai là không có nó. Đây chính xác là lý do. Toán tử mới khi tạo một đối tượng sẽ buộc phải cấp phát một vùng mới trong bộ nhớ cho đối tượng đó . Và dòng được tạo bằng
9, không kết thúc bằng
4: nó trở thành một đối tượng riêng biệt, ngay cả khi văn bản của nó hoàn toàn giống với cùng một dòng từ
4'a. Đó là, nếu chúng ta viết đoạn mã sau:
5 Trong bộ nhớ, nó sẽ trông như thế này: Và mỗi khi một đối tượng mới được tạo,
9một vùng mới sẽ được cấp phát trong bộ nhớ, ngay cả khi văn bản bên trong các dòng mới giống nhau! Có vẻ như chúng ta đã sắp xếp xong toán tử
4, nhưng còn người bạn mới của chúng ta - phương thức Equals() thì sao?
6 Đầu ra của bảng điều khiển:
Hấp dẫn. Chúng tôi biết chính xác những gì
9và
0trỏ đến các khu vực khác nhau trong bộ nhớ. Tuy nhiên, phương thức bằng() nói rằng chúng bằng nhau. Tại sao? Bạn có nhớ ở trên chúng ta đã nói rằng phương thức Equals() có thể được ghi đè trong lớp của bạn để nó so sánh các đối tượng theo cách bạn cần không? Đó là những gì họ đã làm với lớp học
7. Nó có một phương thức bằng() bị ghi đè. Và nó không so sánh các liên kết mà là chuỗi ký tự trong chuỗi. Và nếu văn bản trong các chuỗi giống nhau, thì chúng được tạo ra như thế nào và chúng được lưu trữ ở đâu không quan trọng: trong nhóm chuỗi hoặc trong một vùng bộ nhớ riêng. Kết quả so sánh sẽ đúng. Nhân tiện, Java cho phép bạn so sánh chính xác các chuỗi theo cách không phân biệt chữ hoa chữ thường. Trong tình huống bình thường, nếu bạn viết một trong các dòng, chẳng hạn như viết hoa, kết quả so sánh sẽ sai:
8 Đầu ra của bảng điều khiển:
Trong trường hợp này, lớp
7có một phương thức
9. Nếu điều chính trong so sánh của bạn là chuỗi các ký tự cụ thể chứ không phải trường hợp của chúng, bạn có thể sử dụng nó. Ví dụ: điều này sẽ hữu ích khi so sánh hai địa chỉ email:
0 Trong trường hợp này, rõ ràng là chúng ta đang nói về cùng một địa chỉ nên việc sử dụng phương pháp này
9sẽ là quyết định đúng đắn. Phương thức String.intern()Lớp này
7có một phương thức phức tạp khác -
2; Phương thức này
2hoạt động trực tiếp với
4'om. Nếu bạn gọi một phương thức
2trên một chuỗi, nó:
Bằng cách áp dụng phương thức này
2cho tham chiếu chuỗi được tạo thông qua new, chúng ta có thể so sánh nó với tham chiếu chuỗi từ
4'a qua
4. |