Java面试技术体系整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ydk888888/article/details/81902819


技术体系(面试)上牛客网
   待整理:https://blog.csdn.net/qq_34337272/article/details/79805764
    https://www.nowcoder.com/discuss/5941
  面试网站及书籍:牛客网牛客网  剑指offer 深入理解JVM虚拟机  编程之美, JAVA并发编程实战,牛客网可找内推,
  注意:理解原理,深入深入,发散深入
    提示:很多时候,面试官都是顺着一条线一路问下去的,如果你觉得这条线你不熟悉的话,就要及时拐弯,引导面试官去问其               它方面的问题。千万不要一直往下深入,直到自己跳不出来为止,那就尴了个尬了。
         一般都根据项目来问,然后发散


 Java基础:
        重载与重写的区别?
        说下AtomicInteger的原理
        说下HIVE,自己就说了些hive将sql映射成mapreduce任务等
        讲讲HBase,自己说了下它包括哪些部分,以及怎么存贮等。
        讲讲Hadoop,自己主要说了HDFS以及mapreduce,还是拿经典的wordcount举例子。
  Java源码:HashMap源码,ArrayList源码(ArrayList源码可以扯一扯ArrayList在序列化上的优化,然后扯一扯序列化,还可以顺         便扯一扯网络编程)
  Java数据结构:(https://blog.csdn.net/kangbin825/article/details/68957482)
     HashMap是否线程安全,什么是线程安全的。自己说了下ConcurrentHashMap,谈了些它的分段锁提高并发等。
        ①TreeMap与HashMap区别?实现原理?
        ②List的实现原理?
        ③ArrayList初始化的默认长度?ArrayList的长度是固定的吗?其实现的原理是什么?java自动增加ArrayList大小的思路是?          -作者答:向ArrayList添加对象时,原对象数目加1如果大于原底层数组的长度,则以适当长度新建一个原数组的拷贝, 并修改原数组,指向这个新建数组。原数组自动抛弃(java垃圾回收机制自动回收)。size则在向数组添加对象,自增 1。
         例子:1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的。以下简单模拟            一个数据结构的连环炮。
        比如,面试官先问你HashMap是不是有序的?
        你肯定回答说,不是有序的。那面试官就会继续问你,有没有有顺序的Map实现类?
        你如果这个时候说不知道的话,那这个问题就到此结束了。如果你说有TreeMap和LinkedHashMap。
        那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?
        如果你回答不上来,那么到此为止。如果你依然回答上来了,那么面试官还会继续问你,你觉得它们两个哪个的有序实现            比较好?
        如果你依然可以回答的话,那么面试官会继续问你,你觉得还有没有比它更好或者更高效的实现方式?
        如果你还能说出来的话,那么就你所说的实现方式肯定依然可以问你很多问题。


  线程:

           线程--创建方式,线程池,多线程,生命周期,并发,单例(懒汉恶汉),多线程下保证懒汉的同步性及其优化,synchronized及                            volatile关键字,单例+双重锁定,
                 如何让两个单独的异步线程顺序执行,ThreadPoolexector的重要参数
           锁: 基础:死锁,同步锁,可重入锁,读写锁, 深入:wait和sleep,wait和await,concurrent包
                ReentrantLock和synchronized的区别,了解synchronized的实现原理吗?
                多线程与并发相关知识! 多线程与并发相关知识!! 多线程与并发相关知识!!! 
  
      例子:
            2)Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面的。与上面一                   样,咱们也简单的模拟一个并发包的连环炮。
                比如面试官可能会先问你,如果想实现所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始                    往下执行的话,有什么好的办法吗?
                这个时候你可能会说可以用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原                    理吗?
                如果你继续回答的话,面试官可能会继续问你,你还知道其它的实现方式吗?
                如果你还能说出很多种实现方式的话,那么继续问你,你觉得这些方式里哪个方式更好?
                如果你说出来某一个方式比较好的话,面试官依然可以继续问你,那如果让你来写的话,你觉得还有比它更好的实现                    方式吗?
                如果你这个时候依然可以说出来你自己更好的实现方式,那么面试官肯定还会揪着这个继续问你。
                为什么说面试的时候要引导面试官,原因就在这了。因为面试官的提问很多时候都是有迹可循的,你如果抓住了他的                   轨迹,能够猜到他下面很可能会问什么,那你在回答的时候就可以往你想要谈的方向去说。这样面试时就会显得更加                    从容,更加的游刃有余。
  Spring+SpringMVC: 原理流程,各种注解;
              Spring中最主要的特性,讲了下IOC跟AOP的个人理解
              AOP编程的常用实现方式。cglib了解么?
              Spring源码看过么?聊一聊你印象最深的地方。    

              Spring 框架:配置文件、IoC 思想、DI 依赖注入、面向切面编程、事务等。
              SpringMVC:框架原理、交互、拦截器等。
  反射: +类加载,双亲委派,osgi,jigsaw
            java反射中,Class.forName和classloader的区别(代码说话)

                  https://blog.csdn.net/qq_27093465/article/details/52262340   https://www.jb51.net/article/113928.htm
  IO流:
           例子:
          3)IO包和NIO包中的内容。这部分里面NIO会是重点,IO包大部分都会比较熟悉,因此可能会直接略过,直接问你NIO                  的内容。
            IO包和NIO包的内容相对来说不是很多,首先NIO模型要熟悉,特别是其中的selector一定要非常清楚它的职责和实现原               理。其实NIO的核心是IO线程池,一定要记住这个关键点。有的时候,面试官可能也会问你IO包的设计模式(装饰器模               式),为什么要这样设计?
           有的面试官还会问你有没有更好的设计,这个时候如果你不知道请果断说自己现在的水平有限,想不出来更好的设计,               千万不要信口开河,随意YY。
  
  内存及虚拟机:《深入理解JVM虚拟机》
           jvm的分区,以及每个分区的作用,谈堆区的时候又谈到了堆区分为新生代、老年代跟永久代。然后谈了新生代包括Eden区、Survivor区,然后Survivor区分为From跟To,
          以及在Eden区不足时会进行minor GC,然后什么比较大的对象会直接进入老年代了,以及什么时候进行Full GC了等等。
     例子:
        4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。
          <1>一个GC部分简单的连环炮。
        面试官可以先问你什么时候一个对象会被GC?
        接着继续问你为什么要在这种时候对象才会被GC?
        接着继续问你GC策略都有哪些分类?
        你如果说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?
        你继续说出来了以后,给你举个实际的场景,让你选择一个GC策略?
        你如果选出来了,继续问你,为什么要选择这个策略?

          <2>下面是关于类加载机制的简单连环炮。
        首先肯定是先问你Java的类加载器都有哪些?(https://blog.csdn.net/u011080472/article/details/51332866)
        回答了这些以后,可能会问你每个类加载器都加载哪些类?
        说完以后,可能会问你这些类加载之间的父子关系是怎样的?
        你在回答的时候可能会提到双亲委派模型,那么可以继续问你什么是双亲委派模型?
        你解释完了以后,可能会继续问你,为什么Java的类加载器要使用双亲委派模型?
        你回答完以后,可能会继续问你如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?

          <3>再来一个关于内存的连环炮。
        首先肯定就是问你内存分为哪几部分,这些部分分别都存储哪些数据?
        然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
        接着可能会问你,内存的哪些部分会参与GC的回收?
        完事以后,可能还会问你Java的内存模型是怎么设计的?
        你回答了以后,还会继续问你为什么要这么设计?
        问完以后,还可能会让你结合内存模型的设计谈谈validate关键字的作用?
        你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。

        

  缓存: redis,redis的内部实现机制,hibernte和mybatis等框架的缓存机制等,苏宁. redis数据库
  反向代理及负载均衡:做过的项目最多支持过多少人同时访问,负载均衡么,扯一扯dns负载均衡,图片服务器,反向代理负载             均衡,负载均衡的算法,之前几种反向代理的优缺点
        通过Nginx+Tomcat+Redis实现反向代理、负载均衡及Session同步
        谈谈nginx 的负载均衡的原理。
  模式: 单例模式、简单工厂模式、工厂模式、抽象工厂模式、策略模式、观察者模式、组合模式、适配器模式、装饰模式、代        理模式、外观模式。
    手写单例 --> 双检索(记得有个双重检查锁定 + volatile https://blog.csdn.net/zhangzeyuaaa/article/details/42673245) 。
        手写单例模式,写了懒汉:
        public class Singleton{
        private static Singleton sg;
        private Singleton(){}
        public synchronized static getInstance(){
        if(sg==null){
        sg = new Singleton();
        }
        return sg;
        }
        }

        然后面试官提醒这样多个线程在同时调用getInstance()时都需阻塞着,而我们需要加锁的仅仅是在创建sg时需加锁,经面试官多番引导,终于写出了下面的样子,面试官告诉我这叫双检索。
        public class Singleton{
        private static Singleton sg;
        private Singleton(){}
        public static getInstance(){ 
        if(sg==null){
        synchronized(Singleton.class){ //只有在新创建单例时才有必要加锁
        if(sg==null){//双检索避免重复创建单例
        sg = new Singleton();
        }
        } 
        } 
        return sg;
        }
        }
  分布式:
    给出了一个场景,假设有3台服务器来处理来到的请求,第一台服务器可以处理30个请求,第二台可以处理70个请求,第三            台理120个请求,如何实现在分配请求的服务器上时时分发请求,提示将三台服务器的IP作为key,value中的value。后面            又提示往TreeMap上想,这个没答好。
  数据库:事务,索引,存储过程,视图,分区,约束,引擎,分类,全家桶等等等
          索引的优点,画出索引的结构图《高性能mysql》
          InnoDB中主键索引跟二级索引叶子节点的区别,以及myISAM索引,
          B+树的结构,以及这种结构非常适合于磁盘读写,可以减少IO次数,从而提高性能等。
          数据库事务,数据库范式
          数据库隔离模式,对应的脏读,不可重复读,幻读
          加载数据库的过程,什么什么会导致sql注入吗(preparestatement为什么不会导致sql注入),hibernate防止sql注入,
          数据库优化 https://www.jb51.net/article/19024.htm
  数据结构:栈/堆/队列/树/图 的定义等,什么是堆,怎么建堆,各种排序(堆排序,归并,希尔,冒泡,快速排序(算法复杂度))怎么实现,              什么时候使用,如求第k大数等,求第k大数还能用哪些方法,优缺点--by《编程之美》
            找第K大元素,说出快排的平均时间复杂度。
            找前k大元素,说了还可以使用快排,堆排序也可以。
            如何实现索引,b+树与b树区别
           讲下数组跟链表的区别及各自的优缺点。既然这两种结构都有优点及不足,怎样能充分利用这两种结构的优点,作者答:HashMap,然后谈了些HashMap的原理,提了些java8里面为解决拉链法造成链太长而使用红黑树了等等。

       <1、二分查找

        /**
         * Created by HuangQinJian on 2017/2/27.
         */
        public class main {
            public static int sort(int da[], int a) {
            int len = da.length;
            int left = 0, right = len - 1;
            int mid = 0;
            while (left <= right) {
                mid = (left + right) / 2;
                if (a < da[mid]) {
                right = mid - 1;
                } else if (a > da[mid]) {
                left = mid + 1;
                } else {
                return mid;
                }
            }
            return -1;
            }

            public static void main(String[] args) {
            int a[] = {1, 2, 6, 87, 456, 899};
            int result = sort(a, 899);
            System.out.println(result);
            }
        }
        <2 给一个无序数组int[] nums 和一个整数 target,在这个数组中找到两个数 ,使得这个两个数的和等于target,找到这个数组中所有的满足这样条件的数。
  网络协议:七层四层协议等每一层干啥的,TCP协议和UDP协议区别,如何用UDP实现TCP; TCP四次握手和三次握手的区别;TCP/IP协议,IP 地址子网划分。在浏览器上敲一个URL,按下回车,发生了什么?
        说下TCP跟HTTP中keepalive的区别。
  操作系统:操作系统全家桶(lru,磁盘寻道,死锁条件)
  算法:《编程之美》+《剑指offer》,设计迷宫游戏的时候怎么设计生成迷宫的算法,怎么设计游戏难度,拼图游戏怎么保证一定有解(n*m分奇偶性讨论)
    抽奖游戏(最基本的)
    用你能想到的最快方式找到俩条链的交点。
    给定数组的所有奇数在前,偶数在后,如何翻转过来。
    手写一个冒泡排序
  网络安全:https,ddos之类的,XSS,CSRF
  Linux:各种命令
  Tomcat优化:
  机试题:华为:https://blog.csdn.net/fengsigaoju/article/details/65934742 
    各种排序算法等
  性格测试:华为:http://bbs.tianya.cn/post-516-150970-1.shtml
  用过的框架及插件:karaf.camel,docker,k8s,activeMQ,元数据,
  要了解的框架及插件:分布式编程里的几个框架,找找看,接口幂等性,分布式事务锁(https://blog.csdn.net/lovesomnus/article/details/51785108),

  项目:项目中用户id用的什么,如何生成--注册号..

  博客:https://blog.csdn.net/kangbin825/article/details/68957482
       https://blog.csdn.net/fengsigaoju/article/details/70194632
       https://blog.csdn.net/sinat_35512245/article/details/58209966
       https://blog.csdn.net/qq_34337272/article/details/79805764
       https://blog.csdn.net/weixin_39069037/article/details/79619158
       https://www.nowcoder.com/discuss/5941
       https://www.nowcoder.com/contestRoom
  JAVA6个月实习培训计划:https://www.zhihu.com/question/29581524/answer/44872235 

猜你喜欢

转载自blog.csdn.net/ydk888888/article/details/81902819