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去查valueSystem.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集合中所有的keySet 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;}@Overridepublic 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();}
}
结果: