备战秋招:面试题7

volatile的原理

对volatile修饰的变量进行修改时,JVM会向CPU发出Lock前缀指令:
线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存来完成相应的操作。这也是导致线程间数据不可见的本质原因。因此要实现volatile变量的可见性,直接从这方面入手即可。对volatile变量的写操作与普通变量的主要区别有两点:

(1)修改volatile变量时会强制将修改后的值刷新的主内存中。
(2)修改volatile变量后会导致其他线程工作内存中对应的变量值失效。因此,再读取该变量值的时候就需要重新从读取主内存中的值。


Map、List、Set区别

List:
  • 可以允许重复的对象。
  • 可以插入多个null元素。
  • 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
  • 常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List中添加或删除元素的场合更为合适。

Set:

  • 不允许重复对象
  • 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
  • 只允许一个 null 元素
  • Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:
  • Map不是collection的子接口或者实现类。Map是一个接口。
  • Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
  • TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
  • Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
  • Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

快速排序 手写代码

public class QuickSortDemo{
   public static void quickSort(int[] array, int _left, int _right) {
      int left = _left;
       int right = _right;
       int pivot;//基准线
       if (left < right) {
           pivot = array[left];
           while (left != right) {
               //从右往左找到比基准线小的数
               while (left < right && pivot <= array[right]) {
                   right--;
               }
               //将右边比基准线小的数换到左边
               array[left] = array[right];
               //从左往右找到比基准线大的数
               while (left < right && pivot >= array[left]) {
                   left++;
               }
               //将左边比基准线大的数换到右边
               array[right] = array[left];
           }
           //此时left和right指向同一位置
           array[left] = pivot;
           quickSort(array, _left, left - 1);
           quickSort(array, left + 1, _right);
     	  }
 	}
 }

TCP三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。整个流程如下图所示:
三次握手

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

HTTP状态码

  • 1XX 信息,服务器收到请求,需要请求者继续执行操作
  • 2XX 成功,操作被成功接收并处理
  • 3XX 重定向,需要进一步的操作以完成请求
  • 4XX 客户端错误,请求包含语法错误或无法完成请求
  • 5XX 服务器错误,服务器在处理请求的过程中发生了错误

Spring IOC和AOP

IOC:

控制反转也叫依赖注入,IOC利用java反射机制。所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。

AOP:

是对OOP的补充和完善。AOP利用的是代理,分为CGLIB动态代理和JDK动态代理。OOP引入封装、继承和多态性等概念来建立一种对象层次结构。OOP编程中,会有大量的重复代码。而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理。


Redis淘汰策略

FIFO(First In First Out):

先进先出策略,在实时性的场景下,需要经常访问最新的数据,那么就可以使用 FIFO,使得最先进入的数据(最晚的数据)被淘汰。

LRU(Least Recently Used):

最近最久未使用策略,优先淘汰最久未使用的数据,也就是上次被访问时间距离现在最久的数据。该策略可以保证内存中的数据都是热点数据,也就是经常被访问的数据,从而保证缓存命中率。

以下是基于 双向链表 + HashMap 的 LRU 算法实现,对算法的解释如下:

  • 访问某个节点时,将其从原来的位置删除,并重新插入到链表头部。这样就能保证链表尾部存储的就是最近最久未使用的节点,当节点数量大于缓存最大空间时就淘汰链表尾部的节点。
  • 为了使删除操作时间复杂度为 O(1),就不能采用遍历的方式找到某个节点。HashMap 存储着 Key 到节点的映射,通过 Key 就能以 O(1) 的时间得到节点,然后再以 O(1) 的时间将其从双向队列中删除。

ArrayList和LinkedList有什么区别?

  • ArrayList是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。

  • 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

  • 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。


OSI七层网络模型中对应的协议

OSI七层网络模型对应网络协议
应用层HTTP、TFTP、FTP、NFS、WAIS、SMTP
表示层Telnet、Rlogin、SNMP、Gopher
会话层SMTP、DNS
传输层TCP、UDP
网络层IP、ICMP、ARP、RARP、AKP、UUCP
数据链路层FDDI、Ethernet、Arpanet、PDN、SLIP、PPP
物理层IEEE 802.1A、IEEE 802.2到IEEE 802.11

#SpringMVC工作原理

参考我之前的博客:springMVC
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值