HashMap 底层主要由以下几个部分组成:
- 数组 (Node<K,V>[] table): 这是一个数组,存储的是链表的头节点。默认大小为 16。
- 链表 (Linked List): 当发生哈希冲突时,即不同的键具有相同的哈希值,HashMap
使用链表来解决冲突。链表的每个节点存储一个键值对。 - 红黑树 (Red-Black Tree): 在 Java 8 之后,为了优化性能,当链表长度超过一定阈值(默认是 8)时,链表会转换为红黑树,从而提高查询速度。
基础用法:
package study;
import java.util.HashMap;
public class day01_Collection_Map {
public static void main(String[] args) {
// TODO 集合 - Map
// HashMap: Hash + Map
// 数据存储和HashSet一样,是无序的
HashMap map = new HashMap();
// TODO 添加数据
map.put("zhangsan", "1");
map.put("lisi", "2");
map.put("wangwu", "3");
map.put(545454, "www");
System.out.println(map);
// TODO 修改数据
// put方法也可以修改数据,返回值就是被修改的值
System.out.println(map.put("zhangsan", 4.0));
System.out.println(map);
// TODO 查询数据,根据key去查value
System.out.println(map.get("zhangsan"));
// TODO 删除数据
map.remove("zhangsan");
System.out.println(map);
}
}
电话簿小练习:
package study;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class day01_Collection_Map_进阶 {
public static void main(String[] args) {
HashMap map = new HashMap();
Object preObj;
preObj = map.put("a", "0");
System.out.println(preObj);
preObj = map.put("a", "1");
System.out.println(preObj);
// putIfAbsent 不存在才能放,存在不能放
preObj = map.putIfAbsent("b", "2");
System.out.println(preObj);
preObj = map.putIfAbsent("b", "3");
System.out.println(preObj);
System.out.println(map);
// replace替换修改 存在才能修改,不存在也并不会新增
preObj = map.replace("b", "4");
System.out.println(preObj);
System.out.println(map);
preObj = map.replace("x", "555");
System.out.println(preObj);
System.out.println(map);
// TODO 获取map集合中所有的key
Set set = map.keySet();
for (Object k : set) {
System.out.println(map.get(k));
}
System.out.println(map.containsKey("b"));
Collection values = map.values();
System.out.println(values.contains("4"));
System.out.println(map.containsValue("4"));
}
}
// 电话联系人信息
class Contact {
private String name;
private String phoneNumber;
public Contact(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "姓名: " + name + ", 电话:" + phoneNumber;
}
}
// 电话簿类管理联系人
class PhoneBook {
private HashMap<String, Contact> contactsDict;
public PhoneBook() {
contactsDict = new HashMap<>();
}
// 添加联系人
public void addContact(String name, String phoneNumber) {
Contact contact = new Contact(name, phoneNumber);
contactsDict.put(name, contact);
}
// 删除联系人
public void removeContact(String name) {
contactsDict.remove(name);
}
// 根据名字查找联系人
public Contact findContact(String name) {
return contactsDict.get(name);
}
// 根据名字修改他的电话, 返回他之前的contact信息
public Contact updateContact(String name, String phoneNumber) {
Contact newContact = new Contact(name, phoneNumber);
Object objResult = contactsDict.replace(name, newContact);
if (objResult == null) {
System.out.println("电话簿里查无此人");
return null;
} else {
System.out.println("更新完成,更新后的信息:");
System.out.println(contactsDict.get(name));
return (Contact) objResult; // 返回更新前的联系人信息
}
}
// 打印全部联系人
public void printAllContacts() {
if (contactsDict.isEmpty()) System.out.println("没有联系人");
Set<Map.Entry<String, Contact>> entries = contactsDict.entrySet();
for (Map.Entry<String, Contact> entry : entries) {
System.out.println(entry.getValue());
}
}
}
class Test {
public static void main(String[] args) {
// 创建电话簿实例
PhoneBook phoneBook = new PhoneBook();
// 添加联系人
System.out.println("添加联系人:");
phoneBook.addContact("Alice", "123-456-7890");
phoneBook.addContact("Bob", "234-567-8901");
phoneBook.addContact("Charlie", "345-678-9012");
// 打印所有联系人
System.out.println("\n电话簿中的联系人:");
phoneBook.printAllContacts();
// 查找联系人
System.out.println("\n查找联系人 Bob:");
Contact foundContact = phoneBook.findContact("Bob");
if (foundContact != null) {
System.out.println("找到联系人: " + foundContact);
} else {
System.out.println("找不到联系人 Bob");
}
// 更新联系人电话
System.out.println("\n更新联系人 Charlie 的电话:");
Contact previousContact = phoneBook.updateContact("Charlie", "987-654-3210");
if (previousContact != null) {
System.out.println("之前的联系人信息: " + previousContact);
}
// 再次打印所有联系人
System.out.println("\n更新后的电话簿中的联系人:");
phoneBook.printAllContacts();
// 删除联系人
System.out.println("\n删除联系人 Alice:");
phoneBook.removeContact("Alice");
// 最后打印所有联系人
System.out.println("\n删除后的电话簿中的联系人:");
phoneBook.printAllContacts();
}
}
结果: