2010-07-13 22 views
9

Tôi đã xem xét một số mã GWT được viết bởi nhiều người khác nhau và có nhiều cách khác nhau để so sánh các chuỗi. Tôi rất tò mò nếu đây chỉ là lựa chọn kiểu hoặc nếu được tối ưu hóa hơn một lựa chọn kiểu khác: hoặc một cái được tối ưu hóa hơn một kiểu khác:So sánh chuỗi Java: lựa chọn kiểu hoặc tối ưu hóa?

"".equals(myString); 

myString.equals(""); 

myString.isEmpty(); 

Có sự khác biệt?

+0

Bạn có hỏi về việc so sánh các chuỗi * trống * với các tham chiếu chuỗi hoặc chuỗi ký tự chuỗi và tham chiếu chuỗi nói chung không? – seh

Trả lời

14
"".equals(myString); 

sẽ không ném NullPointerException nếu myString là không. Đó là lý do tại sao rất nhiều nhà phát triển sử dụng biểu mẫu này.

myString.isEmpty(); 

là cách tốt nhất nếu myString không bao giờ là rỗng, bởi vì nó giải thích những gì đang diễn ra. Trình biên dịch có thể tối ưu hóa điều này hoặc myString.equals(""), do đó, nó là một lựa chọn phong cách hơn. isEmpty() cho thấy ý định của bạn tốt hơn equals(""), vì vậy nó thường được ưu tiên.

+2

Bạn đúng về "" .equals (myString), tất nhiên, nhưng tôi thấy rằng cú pháp cố ý này ngược lại làm tôi đau mắt. Tôi nghĩ rằng nếu mã của bạn chạy vào một tình huống mà bạn không thể chắc chắn nếu một giá trị String không phải là null, rất có thể có một vấn đề logic cơ bản được trát vữa. –

+2

@Carl Tôi tìm thấy dấu ngoặc kép bên ngoài dấu ngoặc đơn trông đẹp hơn. Nhưng hoàn toàn nói NPE để nulls sớm và thường xuyên. –

+0

isEmpty() là hiệu quả hơn nhiều vì nó chỉ kiểm tra độ dài chuỗi so với 0, trong khi bằng liên quan đến đúc, so sánh mã băm và như vậy. Xem http://www.docjar.com/docs/api/java/lang/String.html – helpermethod

-3

Cả hai tùy chọn sử dụng "" có thể yêu cầu tạo đối tượng String tạm thời nhưng hàm .isEmpty() không nên.

Nếu họ làm phiền để đặt hàm .isEmpty() trong tôi nói có lẽ tốt nhất nên sử dụng nó!

+4

Tôi sẽ rất ngạc nhiên nếu hằng số chuỗi rỗng không phải là một phần của bất kỳ hồ bơi thực tập nào của JRE ngay sau khi khởi động. Và một khi một hằng số như vậy được sử dụng ở bất cứ nơi nào trong một trình nạp lớp, nó vẫn có sẵn cho đến khi JVM thoát ra, vì vậy tôi sẽ không quá lo lắng về một hit hiệu năng. –

+0

isEmpty() đã được thêm vào như một phương pháp tiện lợi. Trước đó, bạn phải kiểm tra độ dài String đối với null như sau: if (s.length() == 0). – helpermethod

2

apache StringUtils cung cấp một số phương pháp tiện lợi cho, tốt, Chuỗi thao tác.

http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#isBlank(java.lang.CharSequence)

kiểm tra phương thức đó và phương thức được liên kết.

+0

Có phải 'isEmpty' không đủ cho bạn? –

+0

tại sao tôi lại bỏ phiếu cho tôi? Ý tôi là, lợi thế của StringUtils là bạn thêm tính nhất quán vào mã của bạn để bạn không có "" .equals (blah) so với blah.equals (""). – hvgotcodes

+1

@Tom Vâng, các phương thức 'StringUtils' không an toàn. –

5

Hãy coi chừng rằng isEmpty() đã được thêm vào trong Java 6, và thật không may, vẫn có những người phàn nàn khá lớn nếu bạn không hỗ trợ Java 1.4.

+0

rất tốt để biết. – KevMo

0

myString.isEmpty() có lẽ là tốt nhất nếu bạn đang làm việc trên một phiên bản Java gần đây (1.6). Nó có khả năng hoạt động tốt hơn myString.equals ("") vì nó chỉ cần kiểm tra một chuỗi.

"" .equals (myString) có thuộc tính không ném ngoại lệ con trỏ null nếu myString là null. Tuy nhiên vì lý do đó một mình tôi tránh nó vì nó thường là tốt hơn để thất bại nhanh chóng nếu bạn đạt một điều kiện bất ngờ. Nếu không, một số lỗi nhỏ trong tương lai sẽ rất khó theo dõi .....

myString.equals ("") là cách tiếp cận tự nhiên/thành ngữ nhất cho những người muốn tương thích với các phiên bản Java cũ hơn hoặc chỉ muốn rất rõ ràng về những gì họ đang so sánh.

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