博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一些出的不错的Java面试题(一)
阅读量:6590 次
发布时间:2019-06-24

本文共 3973 字,大约阅读时间需要 13 分钟。

前言

本文包含多家公司的面试题,问题的答案纯属个人意见,并不代表标准答案,如有错误欢迎在评论区指正

本文涉及的面试问题不包括算法问题求解(篇幅太小且内容局限性太大)以及分布式系统架构(过于理论和公式化,说白了大家问的都是老掉牙的问题,而架构的原理涉及的太深不好展开),只挑选了部分我个人觉得还有点意思或者有点深度的问题,如果有人感兴趣的话我再接着写几篇

函数式编程有什么特点?

  • 函数和变量的地位相同,可以作为参数和返回值
  • 支持闭包和高阶函数,可以让对象像函数一样操作
  • 支持惰性计算,可以等到需要求值的时候再进行计算
  • 只使用表达式,不使用语句,所有的代码都是单纯的运算过程,所有的操作都是用于处理运算
  • 没有副作用,所有的功能均返回一个新的值,不会改变外部变量的状态和值

CgLib是如何提高调用代理方法的效率的?

采用了FastClass机制,具体内容如下:

  1. 为所有的方法建立索引
  2. 调用前根据方法信息查找索引
  3. 调用时根据索引直接匹配相应的方法直接进行调用

讲一个随机选择算法(从集合A中随机选择m个元素)

算法步骤:

  1. 取m个元素放在集合B中
  2. 对于第i个元素(i > m,i起始为m+1),让这一元素在m/i的概率下,等概率随机替换B中的任一元素
  3. 重复上述操作,直到遍历集合结束
  4. 返回B集合

证明:

  1. 遍历到第m+1个元素时,该元素被保存在B中的概率为m/(m+1),B中元素没有被替换的概率为1-(m/(m+1) * 1/m) = m/(m+1)
  2. 遍历到第i个元素时,前i-1个元素被保存在B中的概率为m/(i-1),第i个元素被保存在B中的概率为m/i,前i-1个元素,每个留在B中的概率为m/i
  3. 当i等于n时,即遍历到第n个元素时,前n-1个元素,每个留在B中的概率为m/n,第n个元素被替换到B中的概率也为m/n,所以每个元素被保存在B中的概率均为m/n

说一下JMM

JMM,即Java Memory Model,即Java内存模型,定义了虚拟机在内存中的工作方式

JMM是隶属于JVM的,从抽象角度看,JMM定义了线程主内存之间的抽象关系:

  • 线程的共享变量存储在主内存
  • 每个线程拥有自己的私有的本地内存,本地内存保存了共享变量的副本

本地内存是JMM的抽象概念,并不是真实存在的,它覆盖了缓存、写缓冲区、寄存器

用最简单的话来介绍一下各种范式

  • 1NF:每一列都是不可分割的数据项
  • 2NF:在1NF的基础上,消除部分依赖
  • 3NF:在2NF的基础上,消除非主属性传递依赖
  • BCNF:在1NF的基础上,保证任意依赖的决定因素必须包含
  • 4NF:在3NF的基础上,消除多值依赖
  • 5NF:在4NF的基础上,保证表不能再分解

广义上的线程阻塞状态可以分为三种,讲一下是哪三种

无限期等待(Waiting):处于该状态的线程不会被cpu分配时间片,需要等待其他线程显式唤醒

  • obj.wait()
  • thread.join()
  • LockSupport.park()

有限期等待(Timed Waiting):处于该状态的线程也不会被其他线程也不会被cpu分配时间片,但是除了被其他线程显式唤醒之外,在等待超时后可以自行唤醒

  • Thread.sleep(millis)
  • obj.wait(timeout)
  • thread.join(millis)
  • LockSupport.parkNanos(nanos)
  • LockSupport.parkUntil(deadline)

阻塞(Blocked):线程会等待获取某一个锁,在期间会被阻塞

  • 进入synchronized修饰的方法或代码块中,且线程没有拥有对应的锁

线程如果发生异常,其他线程会怎么办?

当前线程方法的异常语句之后的代码无效,不影响其他线程的执行

park和wait方法有什么区别?

  • wait方法通过对象的互斥锁实现线程同步,park是通过一个二元信号量实现线程同步的
  • wait方法会让线程放弃当前持有的锁,park方法则不会
  • 在wait方法调用前notify是无效的,但可以通过提前调用unpark方法,来让接下来调用park方法的线程提前获取许可

TCP和UDP的具体应用场景有哪些?

TCP:对通信质量有要求

  • 浏览器协议:http
  • 文件传输协议:ftp
  • 邮件协议:smtp、pop
  • 远程登陆标准协议:Telnet

UDP:对通信速度有要求

  • 简单文件传输协议:tftp
  • 域名系统:dns(也使用了tcp协议,如果发送的报文超过512个字节,会使用tcp发送)
  • 语音和视频

Spring的单例模式是如何实现的?

是通过单例注册表的方式实现的,在AbstractBeanFactory的父类DefaultSigletonBeanRegistry中,有一个ConcurrentHashMap类型的成员变量singletonObjects,保存了beanName => bean对象的映射关系

当需要创建单例对象时,会检查这个对象(注册表)是否已存在映射,如果已存在则直接从表中返回

新生代对象进入老年代有哪几种情况?

  • Eden区满,进行Minor GC,如果存活的对象仍然无法放到新生代,则提前转移到老年代
  • 如果需要创建的对象太大,则直接将对象分配到老年代
  • 新生代中存活超过一定代数的对象(默认为15代)
  • 如果某年龄的对象超过Survivor区的一半,则超过此年龄的对象提前转移到老年代(动态年龄判断)

MVVM和MVC有什么区别?

MVVM是Model-View-ViewModel的缩写,将MVC中View的状态和行为抽象化,同时将视图UI业务逻辑分离开,实现了后端数据、模板页面和控制器的分离

MVC中Controller的一部分职责被拆分出由ViewModel负责,实现了Model和View的自同步,降低了业务和页面的耦合

TCP优化技术你知道的有哪些?

Nalge算法

目的是解决大量小数据传输导致效率下降的问题,实现原理是使链路上永远只有一个小于MSS(最大报文段)的待确定包,尽可能发送大块的数据

只有当以下情况时才允许发送:

  • 包长度达到MSS(最大报文段长度)
  • 包含有FIN
  • 设置了TCP_NODELAY选项
  • 未设置了TCP_CORK选项时,但所有发送的小数据包(长度小于MSS)均被确认
  • 上述条件均未满足时,发生超时

虽然避免了网络拥塞,但是网络的总体利用率很低,也降低了实时性

Delay ACK(延时确认机制)

目的是减少网络中传输大量的小报文数,实现原理是通过新数据来将ACK捎带过去

具体实现如下:

  • 收到数据时,不马上ACK,而是等待一段时间后再进行ACK
  • 如果连续收到两个数据包,仍然需要马上ACK

操作系统的内碎片和外碎片的概念讲一下

  • 内碎片:已经被分配出去的内存空间大于请求所需的内存空间,导致进程拥有的地址空间中有一部分没有使用到,最终白白浪费
  • 外碎片:还没有被分配出去,但是由于太小无法被申请的其他进程使用,最终白白浪费

单例模式比起静态方法有什么优点?

  • 单例类的方法支持覆写
  • 单例类可以被延迟实例化
  • 单例类可以被用于多态,不需要关注全局的状态

Mysql性能优化有哪些方案?

sql优化

  • 避免全表扫描:具体的操作太多了,不一一列举了
  • 避免不必要的操作:略,理由同上

表结构优化

选择合适的数据类型

系统性能优化

  • 增大innodb_buffer_pool_size的值,避免经常性从磁盘中读取数据
  • 在数据库启动前,执行预热脚本进行数据预热,将磁盘上的数据缓存到内存中
  • 使用足够大的innodb_log_file_size(写入缓存),建议调整为innodb_log_file_size的0.25倍
  • 增加max_connections,提高允许同时连接的用户数
  • 增加key_buffer_size的值,提高用于索引块的缓冲区大小
  • 增加thread_cache_size的值,提高可复用的线程数量

结构优化

  • 分库:基于主从架构的读写分离
  • 分表:水平/垂直分表 其他 启用缓存

适配器模式有哪些应用场景?

抽象场景

  • 需要使用某个类,但是这个类的接口不符合系统需要
  • 需要将一些彼此没有太大关联的类联系起来,使其可以一起工作
  • 需要为一些类提供一个统一的输出接口

具体场景

  • spring-aop:将不同的通知类型适配到统一的适配器接口AdvisorAdapter中,可以通过具体的适配器类来获取对应通知的拦截器
  • spring-mvc:使用HandlerAdapter来适配具体的Controller,实现了DispatcherServletController之间的统一接口对接

跨表查询有那些优化思路?

  • 能用join的不用where
  • on中的条件尽可能多
  • 左连接保证右表字段索引,右连接保证左表字段索引,内连接保证任一表字段索引
  • group by的列来自join的第一个表
  • group by的列添加索引,避免产生临时表(存疑)

你会怎么实现微信里“附近的人”算法

  1. 将地图按照一定的经纬度距离切分成方格,每个方格又可以进一步切分出更小的方格
  2. 为每一个格子使用gohash算法进行编号,编号按照最左匹配,可以表示不同精度范围的方格
  3. 当打开“附近的人”功能时,系统根据设备的定位信息得到用户所在的方格编号
  4. 按照选定的精度范围,匹配方格编号的前n位,然后从数据库中搜索方格编号前n位与其一致的用户
  5. 可以通过按方格分库分表加快查询速度

  1. obj泛指普通的对象,下文的thread泛指任意线程对象

  2. 将经纬度按照二分区间的形式不断细分,如果落在左半边就标记为0,否则标记为1

转载于:https://juejin.im/post/5cf8f5315188254c4431709b

你可能感兴趣的文章
亚信数据:盘活大数据时代的隐形财富
查看>>
别恐慌 大众关心的人工智能问题学界都在努力求解
查看>>
高德地图承包外滩花旗大厦:登新代言人TFBOYS巨幅广告
查看>>
互联网金融加快融入百姓生活
查看>>
“与中国同创”支持中国成为创新的第一现场
查看>>
《中国人工智能学会通讯》——6.28 李德毅 : 对人工智能要有点敬畏之心
查看>>
你想知道的关于Hadoop数据资源池的一切
查看>>
四个问题让你了解什么是DCIM?
查看>>
市民尽享精彩生活 探究智慧银川的背后
查看>>
打开“互联运输”新视野 oTMS获A+轮融资
查看>>
《中国人工智能学会通讯》——7.16 什么是篇章语义分析
查看>>
网件Netgear多款路由器存在任意命令注入漏洞 R7000 POC已经开始流传 据说升级固件都没用...
查看>>
智能工厂关键技术:感测组件与大数据分析
查看>>
后门还是漏洞?海康威视建议你尽快升级固件
查看>>
分析:云计算时代即将到来
查看>>
CIO如何构建扁平化的IT部门?
查看>>
IDC:到2019年物联网开支预计突破1.3万亿美元
查看>>
边缘计算架构增强数据中心—雾计算、边缘计算正蓬勃兴起
查看>>
将线下场景搬到线上,青牛软件发布视频呼叫中心产品
查看>>
国内航空业大数据新应用:星环助力厦门航空
查看>>