Java基础
HashMap
- jdk1.7版本,底层是数组+链表,元素的插入使用头插法,可能形成数据丢失或环形链表。
- jdk1.8版本,底层是数组+链表+红黑树,元素的插入使用尾插法,数据覆盖的情况。
- 扩容机制:LoadFactory默认0.75,创建空数组重新Hash。
- resize线程不安全:多线程之间put操作的覆盖;形成环形链表,get时陷入死循环。
- hash方法混合高低位(16位异或),降低冲突概率。
- 2的幂次:1.7判断n-1&hash进行计算位置,2的幂次减少Hash碰撞,1.8判断新增位计算位置;此外,元素能够均匀分布在数组上。
- 重写equals必须重写HashCode。
- Tips:结扩危哈幂。
ConcurrentHashMap
- 安全失败:迭代器在拷贝的集合遍历,对原集合的修改不会抛出异常。
- jdk1.7版本,底层是数组+链表,使用Segment分段锁,继承了可重入锁ReentrantLock,尝试获取锁时存在竞争,自旋,阻塞。get方法没有用锁,但是高效且同步,元素和节点指针用volatile修饰。HashEntry封装键/值对。
- jdk1.8版本,底层是数组+链表+红黑树,使用CAS和synchronized同步,CAS->自旋->sync。Node封装键/值对。
- Tips:结安锁得元。
ArrayList
- 底层是数组,查找访问速度快,增删效率低,线程不安全。
LinkedList
- 底层是双向链表,增删效率高,查找访问速度慢,线程不安全。
TCP
- 三次握手:SYN,seq -> SYN,ACK,seq,ack -> ACK,seq,ack。防止过期的连接再次传到被连接的主机。
- 四次挥手:FIN,seq -> ACK,seq,ack -> FIN,ACK,seq,ack -> ACK,seq,ack。
- 可靠传输:重排序,丢弃重复数据,应答机制,超时重发机制,流量控制,拥塞控制。
UDP
- 无连接,即发送数据之前不需要建立连接。
- 传输效率高,不保证可靠交付。
Http和Https
Http | Https |
---|---|
80端口 | 443端口 |
明文传输 | SSL加密传输(公钥加密,私钥解密) |
无证书 | CA申请证书(证明公钥正确性) |
无状态连接 | 加密传输,身份认证 |
Http请求内容
- 请求行:方法字段(GET,POST),url字段,http协议版本。
- 请求头:User-Agent(浏览器类型),Accept(内容类型),Host(主机地址)。
- 请求数据:post方法中,数据以key value的形式发送请求。
get和post的区别
-
get的请求数据再url上,post的请求在http的包内。
-
get的长度有限制(浏览器限制),post理论上没有限制。
-
get产生一个TCP数据包(header和data),服务器响应200;post产生两个TCP数据包,先发送header,服务器响应100,再发送data,服务器响应200。
粘包和拆包
-
Nagle优化算法封包。
-
报文末尾加入换行符表示完整信息。
-
消息头声明长度,根据长度获取报文。
-
规定报文长度,不足部分空位补齐。
BIO、NIO、AIO模型
BIO | NIO | AIO |
---|---|---|
没有线程可用时阻塞等待连接和数据传输。 处理并发:创建线程执行连接请求。 耗资源。 | Channel,Selector,ByteBuffer组成。 Channel注册到Selector后监听,判断返回值处理请求和数据。 | 无需轮询,IO操作的状态改变后,系统会通知相应的线程处理。 |
TCP/IP网络协议
-
应用层:用户面向应用程序的统称。
-
传输层:提供应用程序间的通信。
-
网络层:定义了IP地址格式。
-
网络接口层:接受IP数据包并通过网络发送;网络上接收物理帧,抽出IP数据报文交给IP层。
ping指令的原理
-
用来检测主机之间是否可通信。
-
基于ICMP协议,发送回送应答消息,如果源主机在一定时间内收到,则认为主机可达。
-
先根据ip地址在网络层中传播,再根据mac地址由数据链路层传到目标主机。
多路复用
- Select:监听的fd数量限制,轮询。
- Poll:大量fd的数组拷贝,无大小限制,水平触发。
- Epoll:没有并发连接数量的限制,利用文件映射内存加速与内存空间的消息传递,水平触发和边缘触发。
序列化
- 对象实现Serializable接口,转换为字节流便于在网络上传输和保存在本地文件。
Java基础
原文地址:https://www.cnblogs.com/ash1523590342/p/13461625.html