回忆录(19年4月24日)

回忆录(19年4月27日)

  这周我们按照我们的模拟面试要求,我需要面完javaweb方向的四个学长。我在前几天分别被他们四个面完了,以下是我面试完后做出的总结,针对这些问题的一些回答,还有我自己的不足之处。

面试一

这一面主要涉及的是数据结构,系统架构设计,计算机网络,并发,数据库
我回答的不好的地方有:JVM的内存结构在项目中的运用(JVM调优等),AQS,Redis部分
1、 tcp断开连接中time_wait处于哪次挥手?如果没有这次挥手会怎么样?
  Time_wait处于四次挥手的最后一次,主动关闭方最后一次会进入time_wait状态,这样做的目的是防止被动关闭方没有接收到自己的确认关闭ack,在等待2msl时间后如果没有接收到被动关闭方的重复发送请求的话就会关闭。
参考链接:https://blog.csdn.net/whuslei/article/details/6667471
2、 TCP和UDP的区别
  区别如下:
  a. TCP是面向连接的,UDP是面向无连接的;
  b. TCP提供可靠的消息传送服务,通过对分组进行编号和确认重传机制来保证,UDP提供不可靠的服务;
  c. TCP的数据面向字节流,UDP面向报文
  d. TCP传输对象是一对一,UDP是一对一,一对多,多对多,多对一
  e. TCP头部开销大,传输慢,UDP头部较小,传输快
  f. TCP主要用于电话,可靠的信息传输,UDP用于广播等
  参考链接:https://www.cnblogs.com/xiaomayizoe/p/5258754.html
3、 Reids的数据结构说一下
  字符串,哈希,列表,集合
4、 Synchronized和reentrantlock的区别和联系
  a. 两者都是可重入锁
  b. Synchronized是非公平锁,Reentrantlock可以选择公平锁或者非公平锁
  c. Reentrantlock可以尝试获得锁,可以设置尝试获得锁的时间
  d. Synchronized基于虚拟机实现,reentrantlock基于jdk编码实现
  e. Reentrantlock必须显式释放锁,在finally中声明unlock
  f. Reentrantlock中还有读写锁,而synchronized是互斥锁
  参考链接:https://www.cnblogs.com/jiangds/p/6476293.html
5、 Java的AQS讲解一下
  AQS(AbstractQueuedSynchronizer)是队列同步器,是JUC下的一个锁组件,它提供了很多功能,包括:获取锁同步状态,FIFO队列,进行唤醒和阻塞线程,很多lock的重要实现类都继承了它,比如:sync,unsync,ReentrantLock,ReentrantReadWriteLock,Semaphore等
  参考链接:https://juejin.im/entry/5ae02a7c6fb9a07ac76e7b70
6、 RPC和消息队列的区别
  RPC就是远程过程调用,使得不同系统间调用服务像使用本地接口那样简单方便。
  消息队列是一个消息缓冲池,消息生产者将消息发送至消息队列,消费者可以获得消息。
  使用RPC和消息队列都可以进行系统之间的服务调用,但是消息队列多了一步缓存,速度会有些缓慢;
  但是同样的这也是它的优点,他有一个缓冲区,使得如果同时很多个请求直接发送到被调用方,那么消息队列可以做到一个限流和削峰的作用;RPC直接调用的话,速度快;
  消息队列算是一个中间件,这样的话对生产者和消费者的耦合度就降低了很多,在生产者和消费者做了修改后,也不会影响到其他结点。
  RPC是一个同步调用(也可以是异步调用),可以得到返回值,消息队列不可以;
  参考链接:https://blog.csdn.net/cfydaniel/article/details/44621163
7、 线程的几种生命状态
  创建,就绪,运行,阻塞,销毁
  他们之间的转换大致为:
  a. 创建->就绪
  b. 就绪-(得到cpu资源)->运行
  c. 运行-(时间片使用完)->就绪
  d. 运行-(I/O请求)->阻塞
  e. 阻塞-(I/O结束)->就绪
8、 JVM的几大数据区以及在项目中的实际运用
  JVM的五大数据区:堆区,方法区,本地方法区,虚拟机栈,程序计数器
  a. 堆区:程序中创建的实例存放区
  b. 方法区:程序加载的类信息,静态变量,常量
  c. 本地方法区:程序使用到的java中使用native修饰的本地方法
  d. 虚拟机栈:存放局部变量表,方法出口,操作数栈
  e. 程序计数器:指示程序执行到的字节码行数
  在实际项目中,我可以根据实际JVM的数据区域查看异常找到相应的bug发生区
  参考链接:http://www.importnew.com/22434.html

面试二

**主要涉及的问题有:java基本类库,java异常结构,集合,线程池,并发,mysql,**回答不好的地方有:异常,并发
1、 java的浮点数底层怎么实现的
  使用32位bit表示,SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM,其中1位表示符号位,8位表示指数,23位表示尾数,S表示符号位,E表示指数,M表示尾数
  参考链接:https://www.cnblogs.com/gavanwanggw/p/6994532.html
2、 java的精度丢失问题怎么解决
  精度丢失是因为计算机使用二进制进行计算,如果一个数可以用2的幂表示,那么就不会精度丢失,比如1/4,4是2的2次幂,1/3,3不是2的幂,所以会丢失。可以使用java.math.BigDecimal 类来解决精度问题。
  参考链接:http://www.cnblogs.com/backwords/p/9826773.html
3、 异常的结构是什么样子的
Java的异常分为两大类,一种是非检查异常(ERROR和RuntimeException以及它们的子类,如:StackOverFlowError或者NullPointerException),另一类是检查时异常,必须用try-catch或者throw处理,如:FileNotFoundException
  参考链接:http://www.importnew.com/26613.html
4、 集合结构是什么样子的
  Java常用集合有:collection->list、set、queue;Map->hashmap,treemap
  List->ArrayList、linklist,vector;set->hashset、treeset
  参考链接:http://www.runoob.com/java/java-collections.html
5、 Redis的几种数据结构?具体实现?
  字符串,哈希,列表,集合
  每个数据结构都有两种或两种以上的实现方式
  字符串:int(8字节的长整型),embstr(小于等于39字节的字符串),raw(大于39字节的字符串)
  哈希:ziplist(元素小于512个,所有值小于64字节),hashtable(ziplist不满足时)
  列表:ziplist(元素小于512个,所有值小于64字节),linklist
  集合:intset(整数集合,元素都是整数并且数量少于512个),hashtable(哈希表)
  参考:《reids开发与运维,第二章》
6、 java的线程池Executor的几个参数,有哪几种构造方法,提供了那几种线程池
  1.核心线程数,2.最大线程数,3.空闲时间,4.空闲时间单位,5.阻塞队列,6.创建线程的线程池,7.饱和策略
  构造方法有:只有1、2、3、4参数的构造方法;有1、2、3、4、5的构造方法;有1、2、3、4、5、6的构造方法,有1、2、3、4、5、6、7的构造方法,有1、2、3、4、5、7的构造方法;
  参考链接:https://blog.csdn.net/xuemengrui12/article/details/78543543
7、 线程的生命周期,阻塞和挂起一样吗
  创建,就绪,运行,阻塞,销毁
  他们之间的转换大致为:
  a. 创建->就绪
  b. 就绪-(得到cpu资源)->运行
  c. 运行-(时间片使用完)->就绪
  d. 运行-(I/O请求)->阻塞
  e. 阻塞-(I/O结束)->就绪
  挂起是主动行为,恢复也是主动完成,阻塞是被动行为,比如遇见了IO请求,恢复也是被动的,不确定是什么时候恢复。
  参考链接:https://blog.csdn.net/baidu_20363843/article/details/69944652

面试三

涉及范围主要是:线程,用户态和内核态,进程和线程,synchronized和lock的区别,JVM,mysql,回答不好的地方有用户态和内核态,JVM运用,mysql索引
1、 线程的生命周期以及他们的转换方式?
  重复,回答如上。
2、 用户态和内核态简单介绍下
  用户态:执行用户应用程序下的一种状态,常见的就是正常执行应用程序代码时。
  内核态:系统运行需要系统提供相应服务时,会从用户态变为内核态。比如:1、系统调用;2、异常事件(缺页异常);3:外围设备中断
  参考链接:https://www.jianshu.com/p/85e931636f27
3、 进程和线程的区别
  重复,回答如上。
4、 synchronized和lock的区别
  问题重复,回答如上。
5、 JVM的内存区域,作用都是什么
  问题重复,回答如上。
6、 对象的分配策略
  a. 对象优先在Eden区分配;
  b. 大对象直接进入老年代;
  c. 存活时间较长的对象优先进入老年代;
  d. 相同年龄的对象内存大于survior内存的一半的对象进入老年代;
  e. 担保不够时进入老年代
  参考链接:http://stor.51cto.com/art/201804/569904.htm
7、 Mysql的底层数据结构,索引的实现是什么?
  Mysql的底层数据结构是B+树和Hash,索引的实现是B+树
  参考链接:https://blog.csdn.net/caijunsen/article/details/83045985
8、 Mysql建索引的优化、
  a. 尽量避免全表扫描;
  b. 不要在where中使用表达式和函数,否则会放弃索引;
  c. 不要在where中使用or,否则会放弃索引;
  d. 不要在where中使用in和not in,否则会放弃索引;
  e. 不要在where中使用<> 或者!=运算符,否则会放弃索引;
  f. 在搜索时不要使用非字母打头的搜索,比如where name=” L”或者name = “%L%”,这时会放弃索引;
  参考链接:https://segmentfault.com/a/1190000005807819

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值