程序猿每日面经[1]

1.TCP三次握手?

  • 第1次握手建立连接时,客户端向服务器发送SYN报文(SEQ=x,SYN=1),并进入SYN_SENT状态,等待服务期确认。
  • 第2次握手分两部分完成:SYN+ACK(请求和确认)报文。

               服务器收到了客户端的请求,向客户端回复一个确认信息(ACK=x+1).
               服务器再向客户端发送一个SYN包(SEQ=y)建立连接的请求,此时服务器进入SYN_RECV状态。

  • 第3次握手,客户端收到服务器的回复(SYN+ACK报文)。此时,客户端也要向服务器发送确认包(ACK)。此包发送完毕客户端和服务器进入ESTABLISHED状态,完成3次握手。

     

2.四次挥手?

  • 客户端发起中断请求,即发送FIN报文。服务器端接到FIN报文后,意思是“我客户端要关闭连接了,如果你还有数据没发送完成,则不必急着关闭Socket,可以继续发送数据”。
  • 所以服务器端给客户端发送ACK,意思是“你的请求我收到了,但是我还没准备好,请你继续等我的消息”。这时客户端进入FIN_WAIT状态,继续等待服务器端的FIN报文。
  • 当服务器端确定数据已发送完成,则向客户端发送FIN报文,意思是“我这边数据发完了,准备好关闭连接了”。
  • 客户端收到FIN报文,就知道可以关闭连接了,但是它还是不相信网络,怕服务器端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果服务器端没有收到ACK就可以重传。服务器端收到ACK后,就知道可以断开连接了。
  • 客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,然后客户端关闭连接。TCP连接就关闭了。

     

3.为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

  • 为了保证发送的最后一个ACK报文段能够到达。
  • 防止“已经失效的连接请求报文段”出现在本连接中。在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

     

4.进程、线程的区别?

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  • 进程有自己独立的地址空间,每启动一个进程,系统会为其分配地址空间;线程没有独立的地址空间,它使用相同的地址空间共享数据。
  • CPU切换一个线程比切换进程的花费小。
  • 创建一个线程比进程开销小。
  • 线程占用的资源比进程少很多。
  • 线程之间通信更方便,同一个进程下,线程共享全局变量、静态变量等数据,进程间的通信以通信的方式(IPC)进行。
  • 多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间))。
  • 进程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换。

     

5.HashMap和HashTable有什么区别? 

  • HashMap是Map接口的主要实现类,线程不安全,效率高,可以存储null的key-value键值对。在jdk7之前底层实现是:数组+链表;在jdk8以后的底层实现是:数组+链表+红黑树。
  • HashTable是Map接口的古老实现类,线程安全,效率低,不能存储null的key-value键值对。

     

6.HashMap的底层实现原理? 

以jdk7为例:

  • 每一对key-value构成一个Entry对象实体, 使用Set存储所有的key,Collection存储所有的value。因为Map中的key是无序、不可重复的, 使用Set存储key要求key所在的类要重写hashCode()方法和equals()方法。Map中的value是无序、可重复的,使用Collection存储value要求重写equals()方法。Map中的Entry是无序、不可重复的。
  • HashMap实例化后,底层创建一个长度为16的一维数组Entry[] table,在执行map.(key1,value1)时,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法后,得到了在Entry数组中的存放位置:若该位置上数据为空,则key1-value1添加成功;若不为空(已存在一个或多个以链表方式存储的数),则比较key1与已存在的数的哈希值:若key1的哈希值与已存在的数据的哈希值均不相同,则key1-value1添加成功;若key1的哈希值与已存在的某一数据(key2-value2)的哈希值相同,则继续比较,调用key1所在类的equals(key2):若equals()返回false,则key1-value1添加成功;若equals()返回true,则使用value1替换value2。

以jdk8为例:

  • 每一对key-value构成一个Entry对象实体, 使用Set存储所有的key,Collection存储所有的value。因为Map中的key是无序、不可重复的, 使用Set存储key要求key所在的类要重写hashCode()方法和equals()方法。Map中的value是无序、可重复的,使用Collection存储value要求重写equals()方法。Map中的Entry是无序、不可重复的。
  • HashMap实例化后,没有创建长度为16的数组,而且底层数组是Node[]而非Entry[],在首次调用map.(key1,value1)时创建长度为16的数组,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法后,得到了在Entry数组中的存放位置:若该位置上数据为空,则key1-value1添加成功;若不为空(已存在一个或多个以链表方式存储的数),则比较key1与已存在的数的哈希值:若key1的哈希值与已存在的数据的哈希值均不相同,则key1-value1添加成功;若key1的哈希值与已存在的某一数据(key2-value2)的哈希值相同,则继续比较,调用key1所在类的equals(key2):若equals()返回false,则key1-value1添加成功;若equals()返回true,则使用value1替换value2.(此外,当数组某索引位上的元素以链表存在的个数大于8且数组长度大于64时,此索引位置上的所有元素改用红黑树)。

     

7.HashMap的扩容? 

  •  不断添加数据时,当超出临界值(且要存放位置非空)时,要进行扩容。默认的扩容方式:扩为原来容量的2倍,并将原数据复制过来。

     

8.Synchronized与Lock的区别? 

  •  Synchronized是java内置关键字;在jvm层面Lock是java类。
  • Synchronized无法判断是否获取锁的状态;Lock可以判断是否获取到锁。
  • Synchronized会自动释放锁(a线程执行完同步代码会释放锁,b线程执行过程中发生异常会释放锁);Lock需要在finally中手工释放锁(unlock()方法),否则容易造成线程死锁。
  • 用Synchronized关键字的两个线程a和线程b,如果当前线程a获得锁,线程b线程等待。如果线程a阻塞,线程b会一直等待下去;Lock锁不一定会等待下去 ,如果尝试获取不到锁,线程可以不用一直等待就结束了。
  • Synchronized的锁可重入,不可中断,非公平;Lock锁可重入,可判断,可公平。
  • Synchronized锁适合代码少量的同步问题;Lock锁适合大量同步的代码的同步问题。

     

9.ConcurrentHashMap与HashTable之间的区别?

  •  都可以用于多线程的环境,但是当HashTable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长时间。
  • ConcurrentHashMap引入了分割,不论它变得多大,仅仅需要锁定map的某个部分,而其他的线程不需要等到迭代完成才能访问map。

简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而HashMap则会锁定整个map。


10.PNG与JPGE之间的区别?

  •  jpeg是有损压缩,png是无损的。正因如此,同一图像质量,png文件的大小大于jpeg文件。
  • png支持透明效果(alpha),jpeg不支持(PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是GIF和JPEG没有的。 )。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值