快手一面凉经
面试的时候断网两次,好惨啊。按照牛友的经验,快手都是连续面试的,而一面面试官却让我等消息。哎,估计凉了。不过面试官还是很好的,断网两次也没有介意,nice。
然后面试情况,前面表现还可以,但是,到了后面的时候,算法写的不好,一道跳台阶,我以为是变态跳台阶,就按照变态跳台阶说了。没想到,是最简单的跳台阶。。。。无语了。第一次视频面试写算法,这方面还是表现不好。下次注意了,视频面试最重要的还是认真听,然后再进行一个分析,再动手,而不是试图从脑海搜索题目,然后就开干。
那么,面经写上:
写一个单例模式
答:一个类的构造函数私有化,然后在类中定义一个私有静态变量,通过一个静态函数get获得私有变量实例即可实现单例。如果想要懒加载,可以用上双重检验锁在get函数中。public class SingleObject { //创建 SingleObject 的一个对象 private static SingleObject instance = new SingleObject(); //让构造函数为 private,这样该类就不会被实例化 private SingleObject(){} //获取唯一可用的对象 public static SingleObject getInstance(){ if(instance==null){ syscronicsed(this){ if(instance==null){ instance = new SingleObject(); } } } return instance; } public void showMessage(){ System.out.println("Hello World!"); } }
跳台阶算法,剑指的原题.只不过不用递归,用的是一个栈加循环实现。
error和exception的区别。举例子
答:error是错误,而exception是异常。
error是jvm无法解决处理的错误,一旦发生,进程坏死,停止运行。常见的错误有:oom,NoClassDefFoundError,StackOverflowError。
而exception是异常。有两个类别:运行期和非运行期:
其中运行期是程序负责搞定的,即,不要catch的,而非运行期是编译器负责的,要显式的catch。
运行期异常有:空指针,下标越界异常,数字格式异常
而非运行期有:ClassNotFoundException和IO操作异常。(这两类是要显示捕获的,所以加载mysql驱动的时候,要catch。)补充一个:ClassNotFoundException和NoClassDefFoundError的区别
答:
当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。
当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行是类找不到,则会抛出一个NoClassDefFoundError的错误。
(这个情况是我们的class文件被删除了)
总结:当动态加载Class的时候找不到类会抛出异常,当编译后找不到类的时候,会抛error强应用和弱应用和软引用的区别。
答:强引用,就是标记了引用,不会直接回收的;而弱引用是gc下一次回收会发现的。而软引用我忘了,回答不知道。
回去好好查了一下后发现:
强引用,在内存不足的时候,宁可报错:oom,也不会回收。而我们程序中有些对象其实没有这么重要,那些对象我们可以用引用级别标明。这样内存不足的时候,标记了软弱虚引用的对象会被回收。
而软引用是:在gc后还内存不足的时候,才会去回收,平时不会回收;
弱引用是:在GC的时候,不管内存空间足不足都会回收这个对象。
虚引用:直接回收了,就像没有引用一样gcroot找不到一样。但是会有一个回调函数,比如打印一个日志:我被回收了之类的。hahsmap的扩容。
答:就是新开一个2倍大小的空间,然后用头插法插入到新的位置;而1.8版本的话,是会用位运算求出节点的位置。spring的ioc和aop
答:简单解释了一下,动态代理和代理的两个类别;还有就是反射机制实现了ioc加载bean。而aop是动态代理实现了扩招功能。计算机网络的7层结构:
答:物理层,链路层,网络层,传输层,应用层(应用层,展示层,通信层)tcp的三次握手,以及为什么要三次握手。
答:防止消息在网络中延迟,导致建立无用的通道private那四个权限的限制
答:一个是标记的变量只能自己使用,一个是标记的变量可以让父子都可以访问,一个是可以接收同一个包的其他类的引用,一个是所有的其他包都可以引用。http的状态码和每个状态码的含义
答:我说出了5类状态码的含义,但是,每一类状态码中,具体每个类别有那些码,我还真不知道。这个问题,发现很多面试官喜欢问,要好好准备这个了。网络中传输层的作用
答:就是跨主机两个进程之间通信,比如接用tcp之类的,端口端口之间搭建通道,就是传输层解决的。让两个进程可以实现通常。屏蔽了网络,物理等底层。还有一道题,是这样的:Number[] a=new Integer[]{0},问,编译是否通过?
答:我说的是,编译不可以,赋值的时候,没有指定大小。结果是,不会有错误。。。因为后面赋值{0},就代表,这个数组的大小赋值为了1,而且初值为0。还有一道题是countdownlatch的,看代码,判断输出是什么。
答:我看了以后,发现没有保证原子性,所以i++输出的结果不会如预期。而后让我将他改为串行,我用了join,用了lock,用了sysc三个进行上锁。实现了一个同步。同时,为了保证可见性,还在共有变量上加上了一个volatile。总结
面试常见的题目需要搞懂来,同时,面试的时候一定有题目是你没有遇到的,这个时候,不要慌,按照自己学习到的知识体系,进行一个良好的分析即可,相信自己。还有就是视频的笔试,需要认真听题目,不要没听完题目就开始做题。冷静是面试最基本的素质。虽说平时很优秀,但是不是每一个面试官都可以在面试过程中了解你平时的表现的。哪怕你简历写的很好,在面试中也要从容展示自我,才可以表现出自己的优点。