HashMap是非线程安全的,HashTable是线程安全的。
1.更新容量和阈值,
if cap>0, 不超过上限的情况下cap、thre都乘2
if cap=0, oldThr>0, 说明初始化的时候赋初始容量参数了,newCap=oldThr
if cap=0, oldthr=0, 直接重新初始化,cap=16,thre=12
2.更新哈希桶, 遍历原桶
if 只有一个节点,直接挪过去
if 链表有超过8个节点,是红黑树, 复杂, 再说todo
if 少于8个的链表,则可能挪到低位,也可能挪到高位,看它本身hash在新容量时应在哪里,代码中巧妙通过与oldCap & 的方式判断需改到高还是低,具体在代码注释中有
7. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
在迭代器中走list的remove大部分情况都会抛 ConcurrentModificationException 异常,从迭代器的next、remove中抛出,因new迭代器类的时候,私有变量expectedModCount会记录修改次数,当List的modCount不一致时会抛出异常,而List的add,remove等修改操作都会增加modCount
也会有在删除某些元素后导致迭代器cursor和size正好相等,hasnext返回false, 不再遍历就不抛异常,但不会遍历到后面移动到已删除位置的元素
List接口中有iterator()接口,因此List的子类都要注意这点
当在浏览器输入google.com回车,根据github库中的分析,会发生24个过程,我们去除其中物理电路和部分前端、windows系统等步骤,将我们关心的步骤进行分析
解析获取协议、主机名、资源地址
根据协议和主机名判断文字是URL还是搜索关键字,if url: 3, if not url: 文字传给默认的搜索引擎
如果主机名部分含有非ASCII字符, 浏览器会对主机名部分使用 Punycode 编码
先非对称加密,然后对称加密,通过两边都知道的随机数和最后用服务端公钥加密的pre-master随机数,生成对称密钥,实现对称加密
数字证书是用CA私钥进行数字签名,此时如果本地的CA公钥和传过来的数字证书都是假的,是否能欺骗用户,不会,CA证书会由它的上级CA给它签名,确定它的身份,层层往上签名,一直到几个全球皆知的大CA root CA, 通过层层授信,确保传过来CA证书的正确性。同时保证了传过来的公钥的正确性
开始对称加密通信
参考文献:
github: https://github.com/skyline75489/what-happens-when-zh_CN
趣谈网络协议: https://pan.baidu.com/s/1CK4a_lw_cYqpMPr186vEsQ 提取码: dydr
参考文献:
https://www.zhihu.com/question/23042131/answer/66571369
https://segmentfault.com/a/1190000004127680
dns解析的过程可能是先递归再迭代,也可能是全部的递归。
本来的递归,说的是从客户端到本机的过程,一机一机的,就像层层方法调用再返回,泽旋说的应该是我图里的设置转发,本机转发到上一层,变成先递归到本机上一层,再迭代
默认都会转发,如果向上转发的过程中有,就返回,不支持,就开始迭代,支持但没有,就一直到根
只有一套,先递归再迭代,如果所有的dns服务器都设置了转发,就一直先向上转发到根,过程中可能就找到返回了,如果到根再往下找,如果过程中有dns服务器不支持转发,那这个服务器就开始迭代,直接从根往下,就相当于是先从客户端到这个不支持的dns服务器是递归。这个dns服务器的查找是迭代,如果一直都支持转发,就是全部的递归。
Update your browser to view this website correctly. Update my browser now