2012-06-13 41 views
13

Vâng, tôi có hai đối tượng StringBuilder, tôi cần so sánh chúng trong Java. Một cách Tôi biết tôi có thể làm làCách hiệu quả để so sánh các đối tượng StringBuilder

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

nhưng điều đó có nghĩa là tôi đang tạo ra hai đối tượng String, là có cách nào tốt hơn để so sánh đối tượng StringBuilder. Có lẽ một cái gì đó mà bạn không cần phải tạo ra các đối tượng bổ sung?

+6

Tôi rất ngạc nhiên khi 'StringBuilder' không khai báo phương thức' equals' của chính nó. – Jeffrey

+0

những gì bạn đang làm là cách tốt nhất để làm điều này, chặn quá nhiều đối tượng 'String'. –

Trả lời

26

Như bạn đã biết, StringBuilder được thừa hưởng equals() từ java.lang.Object và như vậy StringBuilder.equals() trả về true chỉ khi chuyển cùng một đối tượng làm đối số. Nó không không so sánh nội dung của hai StringBuilder s!

Nếu nhìn vào nguồn, bạn sẽ kết luận rằng so sánh hiệu quả nhất (không liên quan đến việc tạo bất kỳ đối tượng mới nào) sẽ so sánh giá trị trả về .length() và sau đó nếu chúng giống nhau, hãy so sánh giá trị trả lại là charAt(i) cho mỗi ký tự.

+0

Đây chính xác là những gì sb1.equals (sb2) thực hiện. – jjm

+12

Không, hoàn toàn, hoàn toàn, hoàn toàn ** KHÔNG. ** –

+0

@jjm: Bạn có liên kết đến mã nguồn để chúng tôi có thể xác minh điều đó không? – Gabe

3

Hai đối tượng StringBuilder không bao giờ bằng nhau. Sử dụng .toString() để lấy biểu diễn chuỗi cho cả hai đối tượng và sau đó sử dụng .equals() để so sánh các đối tượng. Bằng cách này bằng phương thức() từ lớp String được gọi để so sánh giá trị chuỗi của các đối tượng thay vì so sánh vị trí bộ nhớ.

StringBuilder a= new StringBuilder("HELLO JAVA"); 
StringBuilder b= new StringBuilder("HELLO JAVA"); 
if (a.toString().equals(b.toString())){ 
System.out.println("Objects are equal"); 
} 
+0

Nhưng điều đó không hiệu quả như bạn tạo một thể hiện String mới được cấp phát. – alobodzk

0

Bạn có thể sử dụng phương pháp contentEquals() của chuỗi.

StringBuilder s = new StringBuilder("abc"); 
StringBuilder t = new StringBuilder("def"); 

if(s.contentEquals(new String(t)) { 
    System.out.println("Same"); 
} 
+0

s cần phải là một String không phải là một StringBuilder. –

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