hashmap底层 存和读取过程
dubbo负载与降级
redis持久化方式
zk选举
红黑树
https://blog.csdn.net/qq_39382769/article/details/89391664
哈希表是由数组+链表组成
数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;
链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。
哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),在这里我们可以把每个key的位置看作是一个桶,桶里放了一个链表
1、HashMap(int capacity, float loadFactor)
初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。rehash(扩容*2) 操作。
映射不是有序的,table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。
2、通过put()将“key-value”添加到HashMap中。
addEntry(int h, K k, V v, Entry<K,V> n) // 输入参数包括"哈希值(h)", "键(k)", "值(v)", "下一节点(n)"
HashMap将“key为null”的元素存储在table[0]位置,“key不为null”的则调用hash()计算哈希值
3. 解决hash冲突的办法
哈希表,是根据关键字(Key value)而直接访问在内存存储位置的数据结构。对不同的关键字可能得到同一散列地址,即k1!=k2,而f(k1)=f(k2),这种现象称为碰撞(英语:Collision),也叫哈希冲突。
链地址法、开链法(哈希桶)
4、对比
除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同
ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10 (如下图一);之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15(如下图二);当添加第16个数据时,继续扩容变为15 * 1.5 =22个(如下图四)