2013-09-05 37 views
24

Java 7 hỗ trợ chuyển đổi với Strings như mã dưới đâyCâu lệnh switch của Java 7 có sử dụng phương thức equals() bằng String không?

switch (month.toLowerCase()) { 
case "january": 
    monthNumber = 1; 
    break; 
case "february": 
    monthNumber = 2; 
    break; 
default: 
    monthNumber = 0; 
    break; 
} 

Liệu Java gọi equals() phương pháp theo từng trường hợp String? Hoặc nó dựa trên == hoặc intern()?

Đây có phải là chỉ đơn giản là tương đương với:

String month = month.toLowerCase(); 
if("january".equals(month)){ 
monthNumber = 1; 
}else if("february".equals(month)){ 
monthNumber = 1; 
}.. 

UPDATE:

Các String trong sự biểu hiện chuyển đổi được so sánh với các biểu thức gắn liền với từng trường hợp nhãn như thể phương pháp String.equals là đang được sử dụng.

Vì tài liệu chỉ ra rằng hành vi như thể là equals() được gọi.

+0

1) Tôi nghĩ rằng nó sẽ phải, vì nó không có ý nghĩa nếu nó không, phải không? 2) Bạn đã xem mã nguồn chưa? –

+0

@HovercraftFullOfEels - Nó có thể sử dụng '==' và dựa vào 'intern' - nhưng tôi nghĩ rằng sẽ phá vỡ trong nhiều trường hợp. – OldCurmudgeon

+0

@OldCurmudgeon: quá mạo hiểm, tôi nghĩ vậy. –

Trả lời

22

Các docs nói

The String in the switch expression is compared with the expressions associated 
with each case label as if the String.equals method were being used. 

Kể từ khi nó nói như thể đoán của tôi sẽ không mặc dù việc thực hiện nội bộ sẽ được giống như Equals() phương pháp.

+0

Có cơ chế nào khác mà trình biên dịch có thể sử dụng không phụ thuộc vào chi tiết của việc triển khai chuỗi không cho phép thay đổi, ngoài việc kiểm tra bình đẳng tham chiếu trước khi gọi phương thức ảo [và thậm chí trước khi băm? ] – supercat

3

Các switch tuyên bố khi được sử dụng với một String sử dụng phương pháp equals() để so sánh sự biểu hiện cho mỗi giá trị trong báo cáo kết quả case và do đó trường hợp nhạy cảm và sẽ ném một NullPointerException nếu biểu thức là null.

6

Có.

"Lệnh switch khi được sử dụng với một String sử dụng equals() phương pháp để so sánh sự biểu hiện cho mỗi giá trị trong trường hợp tuyên bố và do đó trường hợp nhạy cảm và sẽ ném một NullPointerException nếu biểu thức là null. "

http://java.dzone.com/articles/new-java-7-feature-string

+1

Vì một số bài đăng trên blog ngẫu nhiên cho biết nó không nhất thiết có nghĩa là nó đúng. – cowls

+1

Tôi đã thực sự nghiên cứu một chút công bằng về chủ đề này, câu trả lời của tôi chỉ chứa một trong những tài nguyên tôi đã sử dụng. –

7

Câu lệnh chuyển đổi Java 7 thực sự tạo ra bytecode sử dụng cả phương thức hashCode()equals(). Mã băm được sử dụng để tạo tra cứu chuyển đổi nhanh hơn; tức là để tránh một chuỗi séc bằng như bạn sẽ nhận được với một chuỗi if-else.

+0

Liệu nó có bao giờ kiểm tra tính bình đẳng tham chiếu trước khi tính toán mã băm không? Tôi đoán rằng sẽ khá phổ biến khi một giá trị chuyển đổi sẽ là tham chiếu bằng một trong các nhãn chuyển đổi. – supercat

+0

Không, tôi không nghĩ vậy. Dường như để tính toán mã băm đầu tiên, hãy nhảy tới phần với String's cho hashcode đó và sau đó kiểm tra bằng các Strings đó (thường chỉ có một). – Steinar

+0

Thú vị. Tôi sẽ nghĩ rằng các chuỗi được gán cho câu lệnh 'switch' sẽ là chữ hơn một nửa thời gian, mặc dù tôi đoán băm có thể vẫn là một thắng * nếu * hoặc mã băm đã được tính * hoặc * nó sẽ cần thiết trong Tương lai. – supercat

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