面试高级Java的一些思考( 二 )


2、远程调用dubbo方面 , 可以看下dubbo和zookeeper整合的知识点 , 再深一步 , 了解下dubbo底层的传输协议和序列化方式 。
3、消息队列方面 , 可以看下kafka或任意一种组件的使用方式 , 简单点可以看下配置 , 工作组的设置 , 再深入点 , 可以看下Kafka集群 , 持久化的方式 , 以及发送消息是用长连接还是短拦截 。
以上仅仅是用3个组件举例 , 大家还可以看下Redis缓存 , 日志框架 , MyCAT分库分表等 。准备的方式有两大类 , 第一是要会说怎么用 , 这比较简单 , 能通过配置文件搭建成一个功能模块即可 , 第二是可以适当读些底层代码 , 以此了解下协议 , 集群和失效转移之类的高级知识点 。
如果能在面试中侃侃而谈分布式组件的底层 , 那么得到的评价就会比较好了 , 比如“深入了解框架底层” , 或“框架经验丰富” , 这样就算去面试架构师也行了 , 更何况是高级开发 。
别就知道增删改查 , 得了解性能优化
数据库方面 , 别就知道增删改查 , 得了解性能优化!在实际项目里 , 大多数程序员用到的可能仅仅是增删改查 , 当我们用Mybatis时 , 这个情况更普遍 。不过如果你面试时也这样表现 , 估计你的能力就和其它竞争者差不多了 。
这方面 , 你可以准备如下的技能:
1、SQL高级方面 , 比如group by, having , 左连接 , 子查询(带in) , 行转列等高级用法 。
2、建表方面 , 你可以考虑下 , 你项目是用三范式还是反范式 , 理由是什么?
3、尤其是优化 , 你可以准备下如何通过执行计划查看SQL语句改进点的方式 , 或者其它能改善SQL性能的方式(比如建索引等) 。
4、如果你感觉有能力 , 还可以准备些MySQL集群 , MyCAT分库分表的技能 。比如通过LVS+Keepalived实现MySQL负载均衡 , MyCAT的配置方式 。同样 , 如果可以 , 也看些相关的底层代码 。
哪怕你在前三点表现一般 , 那么至少也能超越将近一般的候选人 , 尤其当你在SQL优化方面表现非常好 , 那么你在面试高级开发时 , 数据库层面一定是达标的 , 如果你连第四点也回答非常好 , 那么恭喜你 , 你在数据库方面的能力甚至达到了初级架构的级别 。
围绕数据结构和性能优化准备面试题
Java核心方面 , 围绕数据结构和性能优化准备面试题!Java核心这块 , 网上的面试题很多 , 不过在此之外 , 大家还应当着重关注集合(即数据结构)和多线程并发这两块 , 在此基础上 , 大家可以准备些设计模式和虚拟机的说辞 。
下面列些我一般会问的部分问题:

  • String a = "123"; String b = "123"; a==b的结果是什么?这包含了内存 , String存储方式等诸多知识点 。
  • HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现 。
  • ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码 。
  • volatile关键字有什么作用?由此展开 , 大家可以了解下线程内存和堆内存的差别 。
  • CompletableFuture , 这个是JDK1.8里的新特性 , 通过它怎么实现多线程并发控制?
  • JVM里 , new出来的对象是在哪个区?再深入一下 , 问下如何查看和优化JVM虚拟机内存 。
  • Java的静态代理和动态代理有什么差别?最好结合底层代码来说 。
通过上述的问题点 , 我其实不仅仅停留在“会用”级别 , 比如我不会问如何在ArrayList里放元素 。大家可以看到 , 上述问题包含了“多线程并发” , “JVM优化” , “数据结构对象底层代码”等细节 , 大家也可以举一反三 , 通过看一些高级知识 , 多准备些其它类似面试题 。
我们知道 , 目前Java开发是以Web框架为主 , 那么为什么还要问Java核心知识点呢?我这个是有切身体会的 。


推荐阅读