Tôi đã tò mò muốn xem như thế nào Java và Scala thực hiện công tắc trên dây:Switching trên Strings
class Java
{
public static int java(String s)
{
switch (s)
{
case "foo": return 1;
case "bar": return 2;
case "baz": return 3;
default: return 42;
}
}
}
object Scala {
def scala(s: String): Int = {
s match {
case "foo" => 1
case "bar" => 2
case "baz" => 3
case _ => 42
}
}
}
Nó có vẻ như Java chuyển mạch trên hashcode và sau đó thực hiện một chuỗi so sánh duy nhất:
0: aload_0
1: dup
2: astore_1
3: invokevirtual #16 // Method java/lang/String.hashCode:()I
6: lookupswitch { // 3
97299: 40
97307: 52
101574: 64
default: 82
}
40: aload_1
41: ldc #22 // String bar
43: invokevirtual #24 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
46: ifne 78
49: goto 82
52: aload_1
53: ldc #28 // String baz
55: invokevirtual #24 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
58: ifne 80
61: goto 82
64: aload_1
65: ldc #30 // String foo
67: invokevirtual #24 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
70: ifne 76
73: goto 82
76: iconst_1
77: ireturn
78: iconst_2
79: ireturn
80: iconst_3
81: ireturn
82: bipush 42
84: ireturn
Ngược lại, Scala có vẻ so sánh với tất cả các trường hợp:
0: aload_1
1: astore_2
2: ldc #16 // String foo
4: aload_2
5: invokevirtual #20 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
8: ifeq 16
11: iconst_1
12: istore_3
13: goto 47
16: ldc #22 // String bar
18: aload_2
19: invokevirtual #20 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
22: ifeq 30
25: iconst_2
26: istore_3
27: goto 47
30: ldc #24 // String baz
32: aload_2
33: invokevirtual #20 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
36: ifeq 44
39: iconst_3
40: istore_3
41: goto 47
44: bipush 42
46: istore_3
47: iload_3
48: ireturn
Có thể thuyết phục Scala sử dụng mẹo băm không? Tôi thà thích một giải pháp O (1) cho một giải pháp O (n). Trong mã thực sự của tôi, tôi cần so sánh với 33 từ khóa có thể.
Tôi không nghĩ Java sẽ làm điều này mọi lúc, bảo đảm rằng tất cả các chuỗi được cung cấp có mã băm khác nhau là gì? Kiểm tra này có thể được thực hiện trong trình thông dịch (JVM) và chỉ chọn giải pháp hashcode nếu tất cả các chuỗi sẽ đánh giá thành giá trị băm khác biệt – smac89
@ Smac89 Va chạm băm không có vấn đề gì cả. Java sẽ đơn giản nhảy đến cùng một vị trí và sau đó thực hiện 2 so sánh chuỗi thay vì 1. Ngoài ra, trình biên dịch biết tất cả các chuỗi và do đó tất cả các mã băm của chúng. Không cần JVM phân tích tình hình động. – fredoverflow
Tôi cũng tò mò ... là Scala vẫn còn hữu ích bây giờ mà Java 8 là ra? –