前言
面试了一周了,经历了各种面试,好的坏的,时间长的时间短的,大公司小公司都有。经历笔试的公司并不是太多,不过也有,这次就先总结经历的笔试题,也有些笔试题我没记录下来,主要是觉得没有什么意义,因为有的地方还问一下比较陈旧的技术,这种问题就直接不想答了,比如有的公司还在问JSP的九大内置对象。互联网公司现在用JSP的已经寥寥无几了吧。
前期先做一下总结,等找到工作后再做全面的面试经历总结。为了确保对公司的隐私,公司的名字我就不写了,以做什么内容代替吧。
笔试
某生鲜互联网公司
一、单选题
1. 在发布-订阅(publish-subscribe)消息模型中,订阅者订阅一个主题后,当该主题有新消息达到时,所有订阅者都会受到通知。下面哪个设计模式最适合这个模型?
A. 适配器(Adapter) B. (Bridge)桥接模式 C.状态模式(state) D. 观察者模式(Observer)
【答】D.观察者模式,这个要对这几个设计模式有了解才能知道是哪个。
2. 栈和队列的共同特点是
A. 只允许在端点处插入和删除元素
B. 都是先进后出
C. 都是先进先出
D. 没有共同点
【答】A. 只允许在端点处插入和删除元素。这个了解了这两种数据结构就明白了,排除法也能排除掉。
3. 下面哪个表达式是不合法的
A. List<? extends Number> foo = new ArrayList<Double>();
B. List<? super Number> foo = new ArrayList<Integer>();
C. List<? super Integer> foo = new ArrayList<Number>();
D. List<? extends Integer> foo = new ArrayList<Integer>();
【答】B. List<? super Number> foo = new ArrayList<Integer>(); 这个问题我没有注意到中间两项泛型里面是super,我看成了四个选项都是extends了,所以当时选的是C。
4. 假如某个JAVA进程的JVM参数配置如下:-Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3, 请问eden区最终分配的大小是多少?
A. 64M B. 500M C. 300M D. 100M
【答】C .300M 这题要对JVM内存结构有了解,-Xms1G 代表堆内存默认为1g容量,-Xmx2G 代表堆内存最大为2g容量, -Xmn500M 代表新生代的默认容量为500M, -XXMaxPermSize=64M 表示永久代最大容量64M, -XX:+UserConcMarkSweepGC 代表使用CMS垃圾收集器,-XX:SurvivorRatio=3, 代表eden区和两个Survivor区的比值是3:1:1,所以eden区的大小为500M的五分之三300M。
5. 下列不属于网络层协议的为
A. TCP B. IP C. IPX D. ICMP
【答】A. TCP 哎。。。,网络编程这块是我最薄弱的地方,所以一些基本的只是我也不太清楚,这个没答对,当时选的是D。
二、多选题
6. 文件aaa的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列哪些命令正确的是?
A. chmod a+x g+w aaa
B. chmod 764 aaa
C. chmod 775 aaa
D. chmod o+x g+w aaa
【答】AC , 在linux系统中,drwxrwxrwx —— 第一位表示文件类型,第一个rwx表示所有者的读/写/执行权限,第二个rwx表示同组用户的读/写/执行权限,第三个rwx表示其他用户的读/写/执行权限。根据题目要求,修改后的文件权限应该为rwxrwxr-x,即111111101 = 775。
7. ls -l显示如下:-rwxrw-r-- 1 aaa bbb 0 3月 4 11:21 ccc ,下面哪些说法是正确的?
A. 该文件是个目录
B. 该文件拥有者所在组用户有权限修改文件
C. 该文件权限的数字表示是764
D. 该文件拥有者是bbb
【答】BC,ccc是一个文件,权限数字是764(-rwxrw-r--转8进制),拥有者是aaa,所在用户组是bbb,文件大小为0,最后修改时间为3月4日11:21
8. 以下有关http协议描述中,哪些是正确的?
A. Post请求一般用于修改服务器上的资源,对发送的消息数据量没有限制,通过表单方式提交
B. http返回码中302表示永久重定向,需要更新URI
C. 可以通过206返回码实现断点续传
D. http1.1实现了持久连接和管线化操作以及主动通知功能,相比http1.0有大幅性能提升
【答】ACD , 这个网络编程又到了我的软肋了,这个真的不知道答案,正确答案也是后来在网上搜出来的,当时就蒙了一个D选项。网络编程的书籍已经准备好了,马上就要学习起来这块的知识。
9. 以下哪个函数不能直接出现在WHERE子句中?
A. SUM B. COUNT C. ORDER BY D. GROUP BY
【答】AB,这个还是比较简单的,聚合函数不能出现在where后面。
10. 假设系统按单道方式运行且采用短作业优先算法,有J1,J2,J3,J4 共4个作业同时到达,则以下哪几种情况下的平均周转时间为10分钟?
A. 执行时间:J1: 1分钟 J2: 5分钟 J3: 9分钟 J4: 13分钟
B. 执行时间:J1: 1分钟 J2: 4分钟 J3: 7分钟 J4: 10分钟
C. 执行时间:J1: 2分钟 J2: 4分钟 J3: 6分钟 J4: 8分钟
D. 执行时间:J1: 3分钟 J2: 6分钟 J3: 9分钟 J4: 12分钟
【答】BC,以A选项为例:四个作业同时达到,由于采用单道方式运行且短作业优先,J1无需等待,执行1分钟完成;J2等待1分钟,执行5分钟完成;J3等待6分钟,执行9分钟完成;J4等待15分钟,执行13分钟完成。—— 故四个作业平均周转时间为:(J1*4+J2*3+J3*2+J4)/4
11. 以下哪些事件会直接导致Linux系统从用户态切换到内核态?
A. 响应硬件中断
B. 编译程序源码
C. 执行系统调用
D. 查看系统日志
【答】AC,系统调用、硬件中断会触发用户态到内核态的切换。Linux的知识也不是太了解,这块内容也是以后要恶补的地方(标注起来)。
12. 以下说法中正确的有?
A. StringBuilder是线程不安全的
B. Java类可以同时用abstract和final声明
C. HashMap中,使用 get(key)==null可以判断这个Hasmap是否包含这个key
D. volatile关键字不保证对变量操作的原子性
【答】AD,StringBuilder是线程不安全的是对的,Java类可以同时被abstract和final修饰,abstract修饰类是为了让子类去实现自己的功能,而final修饰的类是表示不能有子类,这两个关键字相互矛盾所以应该是不可以同时修饰一个类的,HashMap中是可以存在值为null的键值对的。所以不可以通过get(key)==null来判断,volatile可以保证变量的可见性,不能保证变量操作的原子性,(例如:i++这种操作是需要转变成 new AtomicInteger(i).incrementAndGet())。
13. 下列哪些类型能被throw语句抛出?
A. Error B. Exception C. Throwable D. Object
【答】ABC,Error也是可以被throw的,只是通常Error出现程序就中断了,我们并不会去捕获。
14. 以下不同的数据库类型中,哪些不属于关系型数据库范畴?
A. MongoDB B. PostgreSQL C. Redis D. HBase
【答】ABD,这个用过这几个数据库的应该一下就能分辨出来。
三、主观题
15. Java如何进行序列化
【答】Java中如果想要将某个对象序列化,该对象的类需要实现Serializable接口或者实现Externalizable接口。不同的是:实现Serializable接口无须实现任何方法,而实现Externalizable接口则必须为 writeExternal() 和 readExternal() 两个空方法提供实现。—— 在目标类实现了接口以后,就可以通过 ObjectOutputStream 将目标类对象进行序列化并输出了。
16. Exception,Error,RuntimeException在java异常处理中有什么不同
【答】Java中的异常分为 Error 和 Exception。其中Error一般指与虚拟机相关的错误,如系统崩溃、虚拟机错误、动态链接失败等,应用程序无法处理这些错误;Exception则是指应用程序本身可以处理的异常,它分为Checked Exception和RuntimeException —— Checked异常,也叫编译时异常,Java编译器强制要求我们必须对出现的这种异常进行catch处理,否则程序就不能编译通过;RuntimeException,即运行时异常,编译器不会检查运行时异常,我们也可以不处理,当出现这样的异常时,总是抛出由虚拟机接管。当然运行时异常也是可以catch的。
17. wait(), notify()和notifyAll()在使用的时候需要放在同步方法/代码块中吗?为什么?
【答】需要放在同步方法/同步代码块中,因为这三个方法必须由同步监视器对象来调用。在同步代码块中,同步监视器对象就是 synchronized() 括号中的对象;在同步方法中,同步监视器对象则是隐式的当前对象 this。—— 在调用wait()之前,当前线程已经通过synchronized获得了同步监视器的对象锁,调用了wait()以后,线程进入阻塞状态,并释放对象锁;其他线程获得了同步监视器的对象锁以后,就开始执行它的同步方法/代码块了,在同步方法/代码块中如果调用了notify(),则会唤醒在同步监视器对象上wait的任一线程,等剩余的代码执行完后,释放对象锁;被唤醒的线程尝试获取对象锁,获取到了以后线程继续向下执行。notifyAll()和notify()类似,只不过notifyAll()是唤醒在同步监视器对象上wait的所有线程,这些线程后续会争夺对象锁,谁得到对象锁谁继续执行。
18. 编程:在一个整数的数组中删除另外一个整数数组中的元素,并保留原数组的次序
输入包括两行:
1. 第一行是被删除的整数列表(记为列表A),每个整数之间使用空格分隔
2. 第二行是需要删除的整数列表(记为列表B),每个整数之间使用空格分隔
输出只有一行,即列表A中删除列表B元素后的整数列表,输出元素按照在列表A中的次序排列,每个整数之间使用空格分隔
样例输入:
1 2 3 4 5
2 4
样例输出:
1 3 5
这道题的答案不唯一,我给出的思路是,两个数组转为两个ArrayList然后通过两次遍历,把第一行数组中和第二行数组中相等的元素放到一个新的list中,最后直接用第一个数组的list调用removeAll删除到新生成的list中的元素。
某SASS(人力方向的企业服务)公司
/*以下代码通过给定某LinkedList的第一个元素firstNode,查找第倒数第n个元素,请补全代码,并纠正其中的错误,让它能够通过java命令行直接运行,TestUtil不必实现*/
public abstract class Test { class LinkedListNode{ //不用自己实现 } LinkedListNode findTheLastElement(int n,LinkedListNode firstNode){ LinkedListNode found = firstNode; //TODO:具体实现 System.out.println("done"); return found; } static void main(String[] args){ LinkedListNode candidate = TestUtils.init(); Test.findTheLastElement(3,candidate); } }
【答】待纠正的错误是findTheLastElement方法不是静态方法,不能直接使用Test类名调用,main方法没有使用public修饰符。
具体的实现我一开始觉得比较简单的,因为LinkedList是双向链表,所以知道了第一个,要求倒数第3个的数量,就直接从第一个往前倒退三个元素就可以了。调用第一个元素的prev获得倒数第一个元素,再调用倒数第一个元素的prev获取倒数第二个,然后同样方法就可以获取到倒数第三个了。
后来在和第一个面试官聊的时候,如果说现在双向链表改成单向链表了,怎么实现这个功能,我想了想,那就通过两次遍历来实现,第一次遍历,知道了LinekedList的长度,长度减3就是目标元素,在第二次遍历的时候遍历到目标元素直接就可以取出来了。
后来这个面试官说我这样虽然可以实现功能,但是麻烦了一些,还有其他的方式吗?他给出了一种思路,例如:要获得倒数第3个元素,可以在把前3个元素保存起来,遍历完后3个元素后,保存的元素就变成了后3个元素,然后知道遍历到最后一个元素为null,这样如果说最后一组里遍历到第一个元素就结束了,那保存起来的三个元素中间那个就是倒数第3个。
这样一次遍历就可以找出倒数第3个元素了。
某互联网教育公司(做中小学生教育培训的)
这家公司比较奇葩,笔试题七八页,而且做完了面试题后就和HR聊了聊就让回去了,我问为什么是先和HR聊,得到的结果是,我们每天约很多人来面试,如果面试官每个都和应聘者面试的话,那面试官一天就只能只面试了。我就呵呵了,面试官的时间是时间应聘者的时间就不是时间了?HR不懂装懂的还问了问技术的问题,我也是醉了。好了有点跑偏,这家公司的面试题有点多,我就印象最深就是最后的3个逻辑题,其他的题都记不得了。所以就只把最后的3个逻辑推理题写出来吧。
1. 李娜、叶楠和赵芳三位女性的特点符合下面的条件:
(1)恰有两位非常学识渊博,恰有两位十分善良,恰有两位温柔,恰有两位有钱;
(2)每位女性的特点不能超过三个;
(3)对于李娜来说,如果她非常学识渊博,那么她也有钱;
(4)对于叶楠和赵芳来说,如果她十分善良,那么她也温柔;
(5)对于李娜和赵芳来说,如果她有钱,那么她也温柔。
哪一位女性并非有钱?
【答】如果李娜有钱,那她也温柔。根据条件1、2,如果李娜既没有钱也不学识渊博,那她也是温柔。因此,无论哪一种情况,李娜总是温柔。
根据条件4,如果赵芳非常善良,那她也温柔;根据条件5,如果赵芳有钱,那她也温柔;根据条件1、2,如果赵芳既不富有也不善良,那她也是温柔。因此,无论哪一种情况,赵芳总是温柔。
根据条件1,叶楠并非温柔,根据条件4,叶楠并不善良,从而根据条件1、2,叶楠既学识渊博又有钱。再根据条件1,李娜和赵芳都非常善良。
根据条件2、3,李娜并不学识渊博。从而根据条件1,赵芳很学识渊博。最后,根据条件1、2,李娜应该很富有,而赵芳并非有钱。
2. 孙某和张某是考古学家老李的学生。有一天,老李拿了一件古物来考验两人,两人都无法验证出来这件古物是谁的。老李告诉了孙某拥有者的姓,告诉张某拥有者的名,并且在纸条上写下以下几个人的人名,问他们知道谁才是拥有者?纸条上的名字有:沈万三、岳飞、岳云、张飞、张良、张鹏、赵括、赵云、赵鹏、沈括。
孙某说:如果我不知道的话,张某肯定也不知道。
张某说:刚才我不知道,听孙某一说,我现在就知道了。
孙某说:哦,那我也知道了。
请问:那件古物是谁的?
【答】根据孙某说:如果我不知道的话,张某肯定也不知道。这句话可以判断出来,张某拿到的名字肯定不是“万三”、“良”;而且可以确定孙某知道的姓肯定不是“沈”和“张”,(因为如果张某拿的是“万三”,张某肯定知道了答案,而孙某能确定张某肯定不知道,则孙某知道的那个“姓”肯定不是“沈”,同理亦不是“张”),
则剩下的名字还有 赵括、赵云、赵鹏;岳飞、岳云。
根据张某说:刚才我不知道,听孙某一说,我现在就知道了。可以确定他知道的那个名字不是“云”,(如果是“云”,听张某说了之后他还是不能确定答案,因为带“云”的名字有两个)。
剩下的名字还有 赵括、赵鹏;岳飞。
第三句孙某说,他也知道了,可以确定是“岳飞”(如果是两个“赵”姓 的 “赵括” 或者是 “赵鹏”,则孙某还是判断不出来)
3. 填数字
3
13
1113
3113
132113
1113122113
( )
请问最后一个括号里应该填哪个数字?
这种找规律的题,一般问总会找一下相加、相乘、相除、或是前后相乘得后面等等这种规律,但是这个题的规律还是比较有意思的,规律是数数字。
还是简单写一下吧。
3 3
13 1个3
1113 1个1,1个3
3113 3个1,1个3
132113 1个1,1个3,1个2,2个1,1个3
1113122113 (把这个数字读出来就得到最后的结果了) 3个1,1个3,1个1,2个2,2个1,1个3
所以最后的结果是:311311222113
写在最后
其实做面试总结是对自己通过面试来认识到的不足,进行的补充,其实在没有面试的时候已经认识到自己有哪些方面的不足了,但是临时补也来不及了,有些东西也并不是临时补充就能行的,还是要以后要检查学习,坚持总结,通过认识到自己的不足来制定未来的学习计划,现在的计划是,设计模式->java网络编程->Linux知识->数据结构与算法->深入理解微服务->spring以及mybatis等开源项目的源码阅读。
明天就又要继续面试了,越挫越勇,加油吧!