Bạn đang làm việc một cách chính xác. Hãy nhớ rằng, Hashtable
không phải là cấu trúc truy cập trực tiếp. Bạn không thể "lấy mục thứ ba từ ví dụ Hashtable
". Không có ý nghĩa thực sự với thuật ngữ "chỉ mục" khi bạn đang nói về một Hashtable
: các chỉ mục số của các mục có nghĩa là không có gì.
Một Hashtable
đảm bảo rằng nó sẽ giữ cặp khóa-giá trị cho bạn, trong một cách mà nó sẽ được rất nhanh để kết luận một giá trị dựa trên một chìa khóa (ví dụ: cho Donald
, bạn sẽ nhận được Trump
rất nhanh chóng). Tất nhiên, một số điều kiện nhất định phải được thực hiện để nó hoạt động đúng, nhưng đối với ví dụ String-to-String đơn giản của bạn, nó hoạt động.
Bạn nên đọc thêm về bảng băm nói chung, để xem cách chúng thực sự hoạt động sau hậu trường.
EDIT (theo yêu cầu của OP): bạn đang hỏi về việc lưu trữ Student
trường hợp trong Hashtable của bạn. Như tôi đã đề cập ở trên, một số điều kiện nhất định phải được giải quyết cho một Hashtable hoạt động chính xác. Các điều kiện đó liên quan đến khóa khóa, không phải là giá trị .
Nếu dụ Student
của bạn là giá trị, và một chuỗi đơn giản là chính, sau đó không có gì đặc biệt để bạn có thể làm, bởi vì chuỗi nguyên thủy đã trả lời tất cả các điều kiện cần thiết cho một chìa khóa Hashtable thích hợp.
Nếu dụ Student
của bạn là chính, sau đó các điều kiện sau đây phải được đáp ứng:
Bên Student
, bạn phải ghi đè lên các phương pháp hashCode
theo cách như vậy mà lời gọi tiếp theo của hashCode
sẽ trở lại chính xác cùng một giá trị. Nói cách khác, biểu thức x.hashCode() == x.hashCode()
phải luôn là là đúng.
Bên Student
, bạn phải ghi đè lên các phương pháp equals
theo một cách như vậy mà nó sẽ chỉ trả lại true
cho hai trường hợp giống hệt nhau của Student
, và trở false
khác.
Các điều kiện này đủ cho Student
để hoạt động như một khóa Hashtable thích hợp. Bạn có thể tiếp tục tối ưu hóa mọi thứ bằng cách viết một bài thực hành tốt hơn hashCode
(đọc về nó ... nó khá dài để gõ vào đây), nhưng miễn là bạn trả lời hai câu nói trên, bạn tốt để đi.
Ví dụ:
class Student {
private String name;
private String address;
public int hashCode() {
// Assuming 'name' and 'address' are not null, for simplification here.
return name.hashCode() + address.hashCode();
}
public boolean equals (Object other) {
if (!(other instanceof Student) {
return false;
}
if (other == this) {
return true;
}
Student otherStudent = (Student) other;
return name.equals(otherStudent.name) && address.equals(otherStudent.address);
}
}
Đó có vẻ tốt đẹp. Những gì bạn nhìn thấy trong trình gỡ rối là chi tiết thực hiện nitty-gritty của mảng sao lưu và vân vân. Bạn không thực sự giả sử để xem xét điều đó trừ khi bạn tò mò. –
@GregS Cảm ơn Greg vì đã trả lời nhanh. nếu tôi sử dụng một đối tượng sinh viên cho chèn thay vì chỉ là một đối tượng String, tôi sẽ phải ghi đè lên mọi thứ? Bạn có phiền cho tôi thấy làm thế nào tôi có thể thực hiện một điều như vậy? Nhờ bạn và mọi người đã giúp đỡ bạn –