Java 随笔

(1)hashmap:底层实现就是(数组+链表)

key      ----->      hashcode(),得到hashcode值(二进制)     ----->      得到hash值(int)


  HashMap的基础构造器HashMap(int initialCapacity, float loadFactor)带有两个参数,它们是初始容量initialCapacity和加载因子loadFactor            

  initialCapacity:HashMap的最大容量,即为底层数组的长度。 

  loadFactor:负载因子loadFactor定义为:散列表的实际元素数目(n)/ 散列表的容量(m)。

 loadFactor衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a)。因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。


通过字段threshold来判断HashMap的真实容量 

threshold = (int)(capacity:扩充后的最大容量* loadFactor),当超出这个值后,就在进行一次扩容,原来的两倍。


hashmap取模作用让数据最大可能填充在数组的每一位

 indexFor(int h, int length) 调用方法来计算该对象应该保存在 table 数组的哪个索引处。尽量使得每个位置上的元素数量只有一个,而不用再去遍历链表,这样就大大优化了查询的效率。hashmap底层写的方法强制数组的长度总是为2n次方,此时(length-1)二进制的最后一位就是1,所以在和h与的时候最后一位就可以是1或0,反之则为0,当是0时数组大量位置浪费。h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。


Fail-Fast机制:

本质就是记录第一个线程修改的次数并记录下来传递给迭代器的expectedModCount和全部的线程修改次数modcount作比较。判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。(modCount声明为volatile,保证线程之间修改的可见性。)





rpc:

RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。

RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker去实际执行并返回调用结果。



   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值