Java技术栈之如何面试别人~~

以下内容仅做选择性参考~~~~

JAVA

基础组件

HashMap

1、HashMap实现原理、数据结构?
答:最好是针对1.7/1.8作出区分解释
2、简述HashMap的扩容机制,为什么是按2扩容?
答:参考这篇博客https://blog.csdn.net/zjcjava/article/details/78495416
3、为什么说HashMap是线程不安全的?
答:参考这篇博客https://www.jianshu.com/p/e2f75c8cce01
4、线程安全的HashMap有哪些
答:HashTable、ConcurrentHashMap
5、ConcurrentHashMap实现原理?
答:分段锁的概念,最好也区分1.7/1.8的实现原理及区别。

ArrayList

1、ArrayList实现原理?有没有看过源码?
答:默认长度、扩容机制,
2、ArrayList实现的接口有了解吗?
答:RadomAccess接口、Cloneable接口。这些接口都是空接口,他们本质上都是标记接口,因为ArrayList底层就是个数组,数组的存储结构在内存里是连续的,随机存取的性能高,所有用RadomAccess标记。这里可以跟LinkedList做对比扩展。LinkedList不支持随机存储。
Cloneable就是支持克隆方法,只有实现了该接口,默认都是浅克隆,只做了解就行,深克隆比较麻烦,需要把所有的引用类型都克隆一遍,另一种深克隆的解决方式就是用序列化/反序列化,了解即可。
聊到clone方法就可以扩展Object的方法都有哪些
3、线程安全的List有了解吗?简述下其原理
答:Vector、CopyOnWriteArrayList

ThreadLocal

1、ThreadLocal原理、源码有了解吗?
答:涉及存储结构、线性探测法、JAVA内存泄露、弱引用这些概念。参考博客https://juejin.im/post/5cf75a995188254628166745 (作者是我) 。这个也可以再做一层扩展,有没有了解针对ThreadLocal的优化及优化原理:FastThreadLocal

JDK动态代理

1、简述下什么是动态代理?动态代理可以怎么实现?
答:可以参考https://juejin.im/post/5d09e1a3f265da1bc07e3d8a (作者是我)
2、JAVA中动态代理技术都有哪些?比如JDK动态代理要怎么实现、传哪些参数等?有没有了解有什么地方用到了JDK动态代理?
答:cglib动态代理、JDK动态代理。像Spring的AOP、Spring的ConfigBean的实例化、Mabatis都用到了动态代理

Servlet

1、简述对Servlet的理解、Servlet的生命周期
答:如果能基于web.xml配置,Servlet实例过程都有详细阐述最好

多线程+虚拟机

1、谈谈对volatile关键字的理解、作用
答:要答出数据可见性、禁止指令重排序这些点。如果能扩展出来实现原理、缓存一致性协议、内存模型这些概念就更好了。
2、谈谈对synchronize关键字的理解、作用
答:volatile有的作用synchronize都有,只不过synchronize具有排他性。这里再扩展JAVA虚拟机针对synchronize做的优化:偏向锁、轻量级锁、重量级锁(监视器锁)这些概念。
3、了解偏向锁、轻量级锁、重量级锁吗?
答:最好答出这几个锁的底层实现原理及扩展机制,可以引申对象的存储结构
4、对象的存储结构
答:对象头+实例数据+对象填充。对象头又分为MarkWord+对象元数据引用。MarkWord基于不同的锁模式又有不同的存储结构。。。
5、针对重量级锁也叫监视器锁,是否了解底层原理?
答:要答出锁池或者等待队列、阻塞队列这些概念,再扩展wait()、notify()、notifyAll()这些方法的作用。
6、解释下什么是CAS?
答:CompareAndSwap,unsafe包下的native方法。期望值与实际值做比较,如果相等则赋值。底层参数是对象的引用以及引用偏移量、需要更新的值等,了解即可。
因为JAVA语言本身做不到CAS,不能保证原子性,所以要虚拟机提供的本地方法CAS来保证原子性。
7、CAS可能有什么问题?
答:(1)ABA问题。JUC包下有个AtomicStampedReference类,可以感知变更解决这个问题,原理是有个属性可以记录变更。但这个问题一般不影响结果,了解即可。(2)如果长时间CAS会有CPU资源消耗。
8、是否了解JUC包?里面工具类都了解哪些?
答:比如Atomic类、AQS、线程池、LOCK接口、CountDownLatch、CyclicBarrier、Semaphore这些组件,看个人发挥,如果能说出实现原理最好,这个比较难。可以参考https://www.javadoop.com/这里的博客。
9、AQS原理有没有了解?
答:这个只做了解。能简单说说就行,如果能把实现原理答出来那就相当厉害了。
10、说一下线程池参数都是干嘛的?
答:核心线程数、最大线程数、阻塞队列等等。。略
11、Java运行时数据区域都有哪些?
答:略
12、Java的类加载机制有了解吗?
答:双亲委派模型。要是没答到点子上就问是否了解双亲委派模型
13、Java的垃圾收集器、垃圾收集算法有了解吗?Java7\Java8默认的垃圾收集器?
答:复制算法、标记清理、标记整理、分代收集;并行收集器、CMS收集器、G1收集器。
这里可以聊很多
14、基于上述问题可以扩展问,简述下分代收集算法,什么时候触发GC?
答:YOUNG GC 和 FULL GC 分别阐述
15、什么情况下年轻代会晋升到老年代?
16、什么样的对象会被GC?
答:GC ROOT、可达性分析法、程序计数器法‘可以扩展出强引用、软引用、弱引用这些概念。’
17、Java虚拟机参数有了解吗?
答:Xmx Xms 以及他俩的作用及区别,为什么一般情况下Xmx Xms要配置同样的值。其他的看个人发挥
18、JDK内置命令有了解吗?
答:jcmd\jmap\jinfo\jsatct等等

当然JAVA基础要扯的很多,这个主要还是临场发挥

HTTP

1、3次握手,以及为什么是3次
2、4次挥手
3、对HTTPS的理解,HTTPS原理

中间件

redis

1、你们用得redis是什么模式?单机?主从?哨兵?分片集群?
2、对上述几个模式做些阐述
3、redis常用的结构都有哪些?你们都用来存储什么?
4、是否了解基于redis的分布式锁及原理?
5、redis都用来做什么,都了解哪些数据结构?

消息中间件

1、你们都什么场景下用得mq
2、阐述下对rabbitMQ的消息确认机制的理解
3、重复消费的问题怎么解决?

tomcat

1、tomcat是用干嘛的?为什么web应用需要tomcat
答:当然如果基于源码来答或者研究过tomcat源码,长篇大论的说,这都是高手。

注:水平有限,我对中间件的应用不多。这里其实有很多可以问的,主要看对方都用过什么,各类MQ、mycat、es、nginx等等。

mysql

1、索引的原理、存储结构
2、给出几个sql,解释下索引命中问题。
答:如果能执行成本、查询优化器这些概念就比较好
3、有没有了解回表、覆盖索引、三星索引这些概念?
答:以上问题都可以参考这篇文章https://juejin.im/post/5cf3d550f265da1b76388a34
4、数据库的事务隔离级别及造成的影响
5、mysql默认的事务隔离级别
答:mysql默认是可重复读。
6、基于上面的问题扩展问:mysql的可重复读有没有“幻读”这个问题?
答:没有,为什么没有,mysql是怎么解决的?在扩展出间隙锁的概念
7、MVCC有没有了解?
8、阐述下对mysql锁的理解
答:行锁,读写锁,间隙锁这些。可以扩展问,读写分离时怎么保证读操作读到主库,其中一种方法就是加写锁。
9、sql语句的执行过程?
10、是否了解mysql缓存机制
11、mysql主从复制原理

注:水平有限。数据库也可以问问表的设计问题,大数据量分区表的一些问题。

开源框架

Spring

1、Spring是干嘛的,都做了什么?谈谈自己的理解
答:略
2、Spring源码有没有看过?这个就看个人发挥了,能长篇大论的说都是加分项。
答:如果有了解,就可以问一问SpringBean实例化的生命周期,Bean是怎么实例化的?放到了哪里?
3、SpringMVC原理
答:dispatcherservlet,这个百度有很多解释,大部分答得都是比较片面的。这个问题一般就是准备了就能答出来。如果有看过源码的,并对dispatcherservlet的执行流程作出解释就更好了。
4、SpringAOP原理
答:一般都直接说动态代理或者简单说说功能,这是比较片面的答复。如果能说出具体在哪个环节发生动态代理、BeanPostProcessor这些概念就更好了。不过这个地方我也是一知半解,还是只做了解即可。
5、针对SpringBoot相比于SSM项目有什么优势或区别?SpringBoot的启动过程有了解吗?
答:我觉得能简单说出SpringBoot是干嘛的就行,启动过程都属于原理,能说出来都是加分项。我也是一知半解。

SrpingCloud

1、简单说下SpringCloud的核心组件?
答:Eureka、Feign、Ribbon、Hystrix、Zuul

Mybatis

1、SSM中Mybatis要怎么跟Spring集成?要配置什么?
答:SqlSessionFactoryBean等。
2、接着上面的问题,SqlSessionFactoryBean的作用,什么时候会用到?
答:看个人发挥了,答出来都是加分项
3、Mybatis缓存有了解吗?
答:一级缓存、二级缓存。但是Mybatis缓存是比较鸡肋的,为什么鸡肋?
4、接上面问题,实际上Mybatis一级缓存默认是开启的,但在Spring应用中是失效的,即Mybatis一级缓存失效问题这个有了解吗?
答:这个都是加分项,看个人发挥,我面试这几个完全没有答出来的。

设计模式

1、都了解哪些设计模式,工作中都用过哪些设计模式?
答:这个举例说出来什么业务场景下用了什么设计模式就行
2、手写个线程安全的单例模式

public class  Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.instance;
    }

}

算法

只列举出我认为简单且必要的,放在笔试题里或者临时手写。
其他的也可以准备几个难的用来难为人,但我作为面试者还是比较反感难度过大的算法题,随机性太大,准备就会,如果没准备就很难。
当然对于平常就刷算法题的选手这些都是小case
不同平台对算法的要求也不同,比如阿里、字节跳动对算法功底要求就挺高的,一般来说leetcode熟练刷个2、3百道题

当然有些基础的算法题是必知必会的

二分查找

public class BinarySearch {

    public int binarySearch(int[] arr, int target, int n) {
        int low = 0;
        int high = n;
        int mid;
        while (low <= high) {
            mid = low + (high - low) / 2;
            if (arr[mid] == target) {
                return mid;
            } else if (arr[mid] < target) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

}

快排

其他的也可以简单说说KMP算法原理,这个一般算法书里都有写

Leetcode

如果刷过leetcode,可以问几道简单、中等的数组类、动态规划的题目,答出来加分、没答出来拉倒。
譬如:最大子序和、打家劫舍等问题

能力有限,之后会有补充。

你可能感兴趣的:(Java)