字节-面经4

jvm是什么?你对jvm的理解

java程序之所以能够跨平台就是因为jvm,java程序只需要生成jvm上能够运行的字节码,就可以在各种平台上运行

接口和抽象类的区别?

抽象类中可以有静态方法,可以有普通方法,而接口不能。接口是抽象类的一种特例,比抽象类更加的抽象,所有方法必须是abstract的,不能有普通方法。接口不支持方法的默认实现,抽象类支持,抽象类有构造函数,接口没有。接口主要用于定义一个通信契约,在系统架构方面发挥作用,而抽象类主要是为了代码的重用

有种东西叫抽象接口类,在抽象类中实现接口,你实现过这样的代码吗,有什么用?

实现过,其实在抽象类中实现接口,就相当于在抽象类中把接口的一个abstract方法给实现了。如果使用抽象类实现接口,可以完全实现接口中的方法,也可以只实现几个方法,因为抽象类本身就是abstract的,所以可以允许继续存在abstract类,而假如不是是抽象类,你想实现接口的一个方法就必须把接口的所有方法都给实现

你了解的设计模式?

单例模式:有饿汉模式,懒汉模式,双重检验锁,静态内部类,枚举实现

写代码:实现一个抽象类,要求继承它的子类可以不用自己再实现单例模式,而自动可以利用父类的机制来获取到单例

我觉得不能继承吧,既然要通过父类的机制获取单例,那么父类的构造函数必须是private的,而这种情况下根本不能继承

两个栈实现最大栈,要求pop, push, get_max都为O(1)

进程和线程的区别? 各自的通信方式

进程是操作系统调度的基本单元,线程是cpu调度的基本单元,一个进程可以有多个线程,多个线程共享同一个内存空间,不同进程有不同的内存空间,线程是轻量级的进程。进程创建用的fork和vfork,线程创建用的pthread_create

进程间通信的方式:管道,消息队列,信号量

常见的服务器返回的状态码含义?

200:请求成功

301:永久重定向

302:临时重定向

404:url错误

500:服务端错误

cookie和session的区别?

服务器如何识别客户端的请求 如何识别不同的用户?

根据携带的sessionid的不同判断不同的用户

zset的底层实现原理,效率是多少?

   zset的底层是跳表,效率为LogN

synchronized是不是重入锁,重入的底层是怎么实现的?

     是可重入锁,每一个锁关联一个线程持有者和计数器,当计数器为0时表示不持有锁,而如果是持有该锁的线程再次请求获取该锁,那么计数器会进行加1,释放一次就减1,直到0时就释放锁

volatile的原理?

   原理就是lock指令,该指令会将缓存写回到系统内存,并且还会使其他存有该数据地址的线程的数据失效,从而实现了缓存一致性

tcp三次握手为什么不是两次握手或者四次?

   因为如果只是两次握手的话,这个时候服务器认为已经与客户端建立连接,但是假如客户端没有收到确认ack后,就不会认为连接已经建立了,浏览器就不会向服务器发送请求,而服务器却一直等待,假如这样的连接多了的话,服务端就会崩掉,而如果是4次握手的话就浪费资源了,因为3次就足够啦

介绍tcp/ip   http协议?

   ip协议:因特网协议,规定了数据传输时的基本单元和格式,还定义了数据包的递交方法和路由选择

   tcp协议:能够对自己提供的连接实施控制,是一种可靠的传输层协议,tcp协议建立了首次传输数据所需的连接,一旦tcp连接建立成功,应用层之间就可以通过这条tcp连接相互发送数据,它提供了可靠的面向对象的数据流传输服务

   http协议:即超文本传输协议,是建立在tcp协议上的一种应用层协议,最显著的特点是客户端发送的每次请求都需要服务器返回响应

数据库为什么使用b+树做索引?

    因为b+树的磁盘IO代价更低,查询效率更加稳定,更加有利于范围查找

幻读的例子?

   插入一条事先检测不存在的数据时,发现这条数据已经存在了(也就是第一次select读取了,第二次insert发现要插入的数据已经存在了,但是第一次select时并没有)

消息队列中如果回调放入消息队列时网络抖动丢包怎么办?

   第一种方法:在生产者发送数据之前开启事务,然后再发送消息,如果消息没有被rabbitmq接收到,那么生产者会收到异常报错,这个时候回滚事务,然后重试发送消息

   第二种方法:开启confirm模式,这样的话每次发送消息都会分配一个唯一的id,如果发送到了rabbitMQ,那么rabbitMQ会回传一个ack消息,如果这里发送失败,比如网络抖动丢包了,那么rabbitMQ会回调一个nack接口,告诉生产者发送失败

   这两种方法不同之处在于:事务机制是同步的,提交一个事务会阻塞在那儿,但是confirm是异步的,发送一个消息后可以发送下一个消息

     

concurrentHashMap分段锁技术?

        将数据分成一段一段的数据进行存储,然后给每段数据配一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问到。但是有些方法需要跨段,比如size(),containsValue(),这个时候就要按顺序锁住所有分段,操作完毕后按顺序释放所有段

为什么B+树左右节点需要用指针连接起来,而b树不用?

      因为B+树只有叶子结点存储数据,叶节点连接起来刚好是所有数据的有序序列,可以用来做全表扫描或范围查找。而B树的数据存储在各个节点上,叶子结点只有部分数据,所以连起来也没有用

为什么二级索引存储的是主键id而不直接存放数据位置?

     因为这样做减少了出现行移动或者数据页分裂时二级索引的维护工作(当数据更新时,二级索引不需要修改,只需要修改一级索引,一个表只能有一个一级索引,其他的都是二级索引,这样的话就不需要重新构建二级索引了)

     缺点:二级索引体积可能会变大,二级索引需要两次查找,速度没那么快了

一条查询语句是怎么执行的(比如select)?

    先检查该语句是否有权限,如果没有权限,直接返回错误消息,如果有权限,则先查询缓存,有直接缓存,没有的话再通过分析器进行词法分析,提取sql语句的关键元素(这里是select,还有去查询的表,查询的条件),然后判断sql语句是否有语法错误,没有的话进行下一步,优化器确定执行方案,最后进行权限校验,失败返回,成功的话返回执行结果

 

tcp三次握手第三次的ack丢失会怎么办(第二次握手没有回复)?

    服务端:根据tcp的超时重传机制,等待3秒,6秒,12秒后重新发送ack包给客户端,发送次数可以修改,默认为5,如果指定次数后依然没有收到,那么服务端关闭这个连接

    客户端:服务端将响应rst包,这样客户端就能感觉到服务端的错误

tcp怎么保证可靠性?

     1)将数据分割成tcp认为最适合发送的数据块

     2)超时重传

    3)tcp会给发送的每一个包进行编号,接收方对数据包排序,把有序数据传送给应用层

   4)校验和

   5)tcp的接收端会丢弃重复的数据

  6)进行流量控制

  7)进行拥塞控制

拥塞控制的详细过程?

   慢启动,拥塞避免,快重传,快恢复

发布了208 篇原创文章 · 获赞 0 · 访问量 5975

猜你喜欢

转载自blog.csdn.net/qq_40058686/article/details/104526237
今日推荐