**HashMap
1.底层是哈希表(数组+链表+红黑树Jdk1.8之后)
位桶数组:
桶排序思想:对6个人的英语测试成绩(110分)进行排序。假如分数是[6,5,8,8,10,9],用桶排序的思想就是准备10个桶,编号依次为110,将成绩放入对应的桶中,例如6分放入6号桶,两个8分放入8号桶…然后按照桶的标号顺序逐一输出(有就输出,没有就不输出),这就是桶排序的基本思想。
transient Node
链表:
static class Nodeimplements Map.Entry { final int hash; final K key; V value; Node next; Node(int hash, K key, V value, Node next) { this.hash = hash; this.key = key; this.value = value; this.next = next; } public final K getKey() { return key; } public final V getValue() { return value; } public final String toString() { return key + "=" + value; } public final int hashCode() { return Objects.hashCode(key) ^ Objects.hashCode(value); }
2.初始化容量:16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
3.默认加载因子:0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
4.扩容方式:2倍
5.Key和value允许为null,key无序不可重复的
6.非线程安全
常用方法构造方法:
HashMap() --常用
构造一个空的HashMap,默认初始容量(16)和默认负载系数(0.75)。
HashMap(int initialCapacity)–提升性能
构造一个空的HashMap具有指导的初始值的初始容量和默认负载因子(0.75)。
HashMap(int initialCapacity,float loadFactor)–提升性能
构造一个空的HashMap具有指定初始容量和负载因子。
HashMap(Map extends K,? extends V> m)
构造一个新的 HashMap与指定的相同的映射 Map 。
成员方法:
从父接口实现过来的方法
三、HashSet中添加元素等同于向HashMap的key部分添加元素:
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
四、为什么key不允许重复?——之前的HashSet中元素是不可重复
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
和源码有关,首先根据key的hashCode()方法计算出一个hash值,hash值异或哈希值右移16位计算出元素放在位桶数组中哪个位置
如果计算出的hash值一致的,就会调用equals()方法比较内容,内容一致就会覆盖,不一致就用链表节点连接,当节点超过8个,链表变为红黑树
四、HashMap不是可排序集合,详见word文档
public class HashMapTest01 {
public static void main(String[] args) throws IOException {
// HashSet set = new HashSet<>();
// set.add(10);
HashMap map = new HashMap<>();
//1.key和value允许为空
//2.key无序不可重复
map.put(10, 1);
map.put(6, 1);
map.put(9, 1);
map.put(8, 1);
map.put(5, 1);
map.put(7, 1);
map.put(4, 1);
map.put(2, 1);
map.put(3, 1);
map.put(1, 1);
map.put(10, 1);
map.put(15, 1);
map.put(13, 1);
map.put(11, 1);
System.out.println(map);
}
}
HashMap
key和value是自定义类
key值是自定义类型:key不能重复,自定义类重写hashcode()和equals()
value值是自定义类型:value能重复,自定义类不需要重写hashcode()和equals()
package sample.day16.HomeWork;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
public class Work5 {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(new Car("布加迪威龙"),4623642);
map.put(new Car("法拉利"),2413642);
map.put(new Car("GTR"),14623642);
map.put(new Car("保时捷"),24623642);
Set set = map.keySet();
for (Car key:set
) {
System.out.println(key.getName()+"="+map.get(key));
}
Set> set1 = map.entrySet();
for (Map.Entry entry1:set1) {
System.out.println(entry1.getKey().getName()+"="+entry1.getValue());
}
}
}
package sample.day16.HomeWork;
import java.util.Objects;
public class Car {
private String name;
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Car)) return false;
Car car = (Car) o;
return Objects.equals(name, car.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "Car{" +
"name='" + name + ''' +
'}';
}
}



