2010-01-06 35 views
20
StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 
System.out.println(sb1 == sb2); 
System.out.println(sb1.equals(sb2)); 

Ở đây cả hai đều trả về false. Làm thế nào là nó có thể?So sánh nội dung StringBuffer với bằng

Trả lời

27

Phương thức equals của StringBuffer không bị ghi đè từ Object, vì vậy nó chỉ là bình đẳng tham chiếu, tức là giống như sử dụng ==. Tôi nghi ngờ lý do cho điều này là StringBuffer có thể sửa đổi và ghi đè equals chủ yếu hữu ích cho các lớp giống như giá trị mà bạn có thể muốn sử dụng làm khóa (mặc dù danh sách cũng có một danh sách được ghi đè là equalsStringBuffer. một chút không phù hợp).

18

Bạn đang so sánh các tham chiếu đến các đối tượng StringBuffer hơn là các chuỗi thực trong StringBuffer.

System.out.println(sb1.toString().equals(sb2.toString())) sẽ trả về đúng và tôi cho rằng đây là những gì bạn đã mong đợi hoặc muốn đạt được.

2

StringBuffer dường như không có phương pháp equals của riêng nó, vì vậy tôi đoán đầu tiên của tôi sẽ là StringBuffer kế thừa phương pháp equals của Object, mà so sánh sử dụng sb1 == sb2. Do đó, cả hai phương pháp đều mang lại kết quả tương tự.

2

cả hai so sánh hai tham chiếu đến đối tượng (sb1 là một, và sb2 là thứ hai), do đó cả hai đều khác nhau.

Nếu bạn đang cố gắng để so sánh nội dung - Phương pháp sử dụng compareTo (...) trong Chuỗi lớp - đó là - lần đầu tiên có được Chuỗi nội dung của StringBuffer sử dụng phương pháp toString() (.toString(). compareTo).

Ps. tính đến JDK 5, có một lớp nhanh hơn nhiều hoạt động chính xác như StringBuffer - nó là StringBuilder và cũng là nhưng không phải là chủ đề an toàn.

StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 

System.out.println(sb1.toString().compareTo(sb2.toString())); 
+0

StringBuidler không an toàn theo như tôi biết – Yaneeve

+0

StringBuilder không phải là chuỗi an toàn. Từ tài liệu SDK trên StringBuilder: "tương thích với StringBuffer, nhưng với ** không đảm bảo đồng bộ hóa **", từ đoạn giới thiệu tại đây: http://java.sun.com/j2se/1.5.0/docs/api/ java/lang/StringBuilder.html –

+0

tất nhiên, xấu của tôi. đọc tài liệu của StringBuffer quá nhanh, CNTT được hỗ trợ bởi StringBuilder, do đó nó được sử dụng bởi một chuỗi đơn. xin lỗi vì chuyện đó. – mkolodziejski

4

Câu trả lời đơn giản là StringBuffer (và StringBuilder) không xác định lại ngữ nghĩa cơ sở của Object.equals(). Vì vậy, equals trên một StringBuffer sẽ chỉ đơn giản là so sánh các tham chiếu đối tượng.

Trong thực tế, String, StringBuffer, StringBuilder và CharBuffer tất cả thực hiện các giao diện CharSequence, và javadoc cho giao diện này nói điều này:

Giao diện này không tinh chỉnh các hợp đồng chung của equals và phương pháp hashCode. Kết quả của việc so sánh hai đối tượng thực hiện CharSequence do đó, nói chung, không xác định. Mỗi đối tượng có thể được thực hiện bởi một lớp khác nhau, và không có gì đảm bảo rằng mỗi lớp sẽ có khả năng kiểm thử các cá thể của nó đối với sự bình đẳng với các đối tượng khác. Do đó, không thích hợp để sử dụng các cá thể CharSequence tùy ý như các phần tử trong một tập hợp hoặc như các khóa trong bản đồ.

0

Tự hỏi tại sao StringBuffer không ghi đè phương pháp equals. Có lẽ vì nội dung của đối tượng thu được bằng phương pháp toString() và có phương pháp mong muốn.

5
1. System.out.println(sb1 == sb2); 

StringChức năng bằng phương pháp trả về chỉ đúng khi đối tượng StringBuffer được so sánh với chính nó. Nó trả về false khi so sánh với bất kỳ StringBuffer nào khác, ngay cả khi cả hai chứa cùng một ký tự.

Điều này là do "==" kiểm tra sự bình đẳng tham khảo và vì cả hai SB1 và ​​SB2 là tài liệu tham khảo đối tượng khác nhau, do sản lượng trong trường hợp này là "false"

Tuy nhiên nếu bạn muốn kiểm tra xem nội dung là bình đẳng trong hai đối tượng StringBuffer, bạn có thể sử dụng này:

sb1.toString().equals(sb2.toString()) 

2. System.out.println(sb1.equals(sb2)); 

này được đưa ra là "false" vì Equals() phương pháp chưa được ghi đè trong lớp StringBuffer. Vì vậy, nó đang sử dụng phương thức .equals() từ lớp cha "Object" của nó. Trong lớp đối tượng .equals() đã được viết để kiểm tra sự bình đẳng tham chiếu.

Lưu ý rằng sb3.equals (sb4) sẽ trả về "true" trong trường hợp String. Bởi vì phương thức .equals() đã được ghi đè trong lớp String để kiểm tra và kết hợp nội dung của hai Strings khác nhau.

0

Stringbuffer equals() không bị ghi đè. Nó không so sánh các giá trị, nó chỉ so sánh các giá trị tham chiếu. Đó là lý do tại sao bạn đang nhận được sai như cả hai đều đề cập đến các đối tượng khác nhau.

Các vấn đề liên quan