2008-08-27 75 views
7

Cách đơn giản nhất để tạo bảng băm (hoặc mảng kết hợp ...) trong Java là gì? Google-fu của tôi đã bật lên một vài ví dụ, nhưng có một cách tiêu chuẩn để làm điều này?Làm cách nào để tạo bảng băm trong Java?

Và có cách nào để điền bảng với danh sách các cặp khóa-giá trị mà không cần gọi riêng phương thức bổ sung trên đối tượng cho mỗi cặp không?

Trả lời

23
Map map = new HashMap(); 
Hashtable ht = new Hashtable(); 

Cả lớp có thể được tìm thấy từ gói java.util. Sự khác biệt giữa 2 được giải thích trong jGuru FAQ entry sau đây.

+1

+1, bạn đề cập đến cả Hashtable và HashMap. – bgw

+0

Từ mục nhập jGuru: "Sự khác biệt chính giữa hai là truy cập vào Hashtable được đồng bộ trên bảng trong khi truy cập vào HashMap không phải. Bạn có thể thêm nó, nhưng nó không có ở đó theo mặc định. sự khác biệt là iterator trong HashMap là không an toàn trong khi điều tra cho Hashtable không phải là. Nếu bạn thay đổi bản đồ trong khi lặp lại, bạn sẽ biết. " – ErikAGriffin

2
import java.util.HashMap; 

Map map = new HashMap(); 
1

Điều gì Edmund nói.

Vì không gọi điện thoại .thêm tất cả thời gian, không, không phải là thành ngữ. Sẽ có nhiều hack (lưu trữ nó trong một mảng và sau đó looping) mà bạn có thể làm nếu bạn thực sự muốn, nhưng tôi sẽ không khuyên bạn nên nó.

7

Cũng đừng quên rằng cả Bản đồ và Hashtable là chung trong Java 5 trở lên (như trong bất kỳ lớp nào khác trong Collections framework).

Map<String, Integer> numbers = new HashMap<String, Integer>(); 
numbers.put("one", 1); 
numbers.put("two", 2); 
numbers.put("three", 3); 

Integer one = numbers.get("one"); 
Assert.assertEquals(1, one); 
0

Và có cách nào để cư bảng với một danh sách các Key-> cặp giá trị không riêng gọi một phương thức add trên đối tượng cho mỗi cặp?

Một vấn đề với câu hỏi của bạn là bạn không đề cập đến dữ liệu của bạn bắt đầu từ dữ liệu nào. Nếu danh sách các cặp của bạn đã xảy ra là một danh sách các đối tượng Map.Entry nó sẽ khá dễ dàng.

Chỉ cần để ném này ra, có một (nhiều maligned) lớp có tên java.util.Properties đó là một phần mở rộng của Hashtable. Nó chỉ mong đợi các khóa và giá trị String và cho phép bạn tải và lưu trữ dữ liệu bằng cách sử dụng các tệp hoặc luồng. Định dạng của tệp mà nó đọc và viết như sau:

key1=value1 
key2=value2 

Tôi không biết đây có phải là điều bạn đang tìm kiếm hay không, nhưng có những trường hợp điều này có thể hữu ích.

19

Bạn có thể sử dụng dấu ngoặc kép để thiết lập dữ liệu. Bạn vẫn gọi thêm hoặc đặt, nhưng ít xấu xí hơn:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{ 
    put("foo",  1); 
    put("bar",  256); 
    put("data",  3); 
    put("moredata", 27); 
    put("hello", 32); 
    put("world", 65536); 
}}; 
+1

Loại biến của bạn thực sự là một 'Bản đồ'. 'Bản đồ MYHASH = new Hashtable ()' –

0

Điều quan trọng cần lưu ý là hàm băm của Java ít hơn tối ưu. Nếu bạn muốn ít va chạm hơn và loại bỏ hoàn toàn khả năng băm lại ở công suất ~ 50%, tôi sẽ sử dụng thuật toán Buz Hash Buz Hash

Lý do giải thuật băm của Java yếu nhất rõ ràng.

"a".hash() cung cấp cho bạn các đại diện ASCII của "a"-97, vì vậy "b" sẽ 98. Toàn bộ điểm băm là gán một số tùy ý và "ngẫu nhiên nhất có thể".

Nếu bạn cần bảng băm nhanh và dơ, bằng mọi cách, hãy sử dụng java.util. Nếu bạn đang tìm kiếm thứ gì đó mạnh mẽ có khả năng mở rộng hơn, tôi sẽ xem xét việc triển khai của riêng bạn.

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