内容目录
- 哈希结构概述
- 代码实现
- 注意问题
- HashMap迭代的方式
- 解决哈希冲突的方式
- HashTable和HashMap的联系与区别
- java中的四种引用
- 五道大数据习题
哈希结构概述
1、概念:Hash(哈希),又称“散列”。哈希表综合数组和链表二者的特性,达到了查询容易,插入删除也容易的数据。
①数组 => 它在内存空间中是连续的,占用的内存比较多,我们添加删除一个元素的时候时间复杂度比较大,查询容易。
②链表 => 它在内存空间中是分散的,占用的内存也是分散的,添加删除一个元素的时候时间复杂度比较小,查询难。
- hashCode() 表示的是对当前对象的唯一标示。计算 hashCode 的过程就称作哈希。
- 最常用哈希表的数据结构:数组+链表 散列表。
- 哈希表中存储键值对 key-value,散列指的是通过key定位到存储的位置,针对任意的key通过哈希算法转换为固定的位置(数组)。
- key位置关系并不是一对一,多对一的关系,所以会引发哈希冲突。
代码实现
查找一个<key,value>为例
1)先通过hash算法,找到与key对应的存储位置
2)访问该位置的value与当前value比较,如果相等,直接返回
3)反之才需要去当前链表中找
class MyHash<K,V>{
private Node<K,V>[] table;
class Node<K, V>{
protected K key;
protected V value;
protected Node<K, V> next;
}
}
class MyPriorityQueue<E extends Comparable<E>>{
private E[] queue;//存放元素的容器
private int size; //有效元素个数
private static int defaultCapacity = 5;
public MyPriorityQueue(){
this(defaultCapacity);
}
public MyPriorityQueue(int capacity){
queue = (E[])new Comparable[capacity];
}
public void add(E val){
//判满
if(size == queue.length){
//扩容
queue = Arrays.copyOf(queue,queue.length*2);
}
if(size == 0){
queue[0] = val;
size++;
} else{
adjust(size, val);
size++;
}
}
public void adjust(int index,E val){
while (i