BAT软件开发岗位面试题汇总

来源:互联网 发布:java重写hashcode方法 编辑:程序博客网 时间:2024/06/05 12:45

第一期–抛砖引玉


1.1 Java基础


1:集合类以及集合框架;HashMap与HashTable实现原理,线程安全性,hash冲突及处理算法;ConcurrentHashMap

2:如何将一个Java对象序列化到文件里

3:Java的并发、多线程、线程模型

4:Java中实现多态的机制是什么

5:什么是线程池,如何使用?

6:数据一致性如何保证;Synchronized关键字,类锁,方法锁,重入锁

7:进程和线程的区别

8:说说你对Java反射的理解

9:Java如何调用c、c++语言

10:你所知道的设计模式有哪些

1.2 数据结构与算法


1:堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面)

2:求1000以内的水仙花数以及40亿以内的水仙花数

3:最快的排序算法是哪个?给阿里2万多名员工按年龄排序应该选择哪个算法?堆和树的区别;写出快排代码;链表逆序代码

4:万亿级别的两个URL文件A和B,如何求出A和B的差集C,(Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

5:子串包含问题(KMP 算法)写代码实现

1.3 其他


1:死锁的四个必要条件

2:常见编码方式;utf-8编码中的中文占几个字节;int型几个字节

3:实现一个Json解析器(可以通过正则提高速度)

4:MVC MVP MVVM; 常见的设计模式;写出观察者模式的代码

5:TCP的3次握手和四次挥手;TCP与UDP的区别

6:HTTP协议;HTTP1.0与2.0的区别;HTTP报文结构

1.4 非技术问题


1:研究比较深入的领域有哪些

2:对业内信息的关注渠道有哪些

3:最近都读哪些书

4:自己最擅长的技术点,最感兴趣的技术领域和技术点

5:项目中用了哪些开源库,如何避免因为引入开源库而导致的安全性和稳定性问题

1.5 HR问题


1:您在前一家公司的离职原因是什么?(划重点,基本都会问到)

2:讲一件你印象最深的一件事情

3:介绍一个你影响最深的项目

4:介绍你最热爱最擅长的专业领域

5:公司实习最大的收获是什么

6:与上级意见不一致时,你将怎么办

7:自己的优点和缺点是什么?并举例说明?

8:你的学习方法是什么样的?实习项目中遇到的最大困难是什么以及如何解决的

9:说一件最能证明你能力的事情

10:针对你你申请的这个职位,你认为你还欠缺什么

11:如果通过这次面试我们单位录用了你,但工作一段时间却发现你不适合这个职位,你怎么办

12:项目中遇到最大的困难是什么?如何解决的

13:你的职业规划以及个人目标;未来发展路线及求职定位

第二期–破壳而出(附答案)


2.1 java基础


1,在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和>continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带>标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法>其实不知道更好)
2,Java 中会存在内存泄漏吗,请简单描述。
答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。
3,是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
4,什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
答:Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
5,Java支持多继承么?
答:不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
6,创建线程有几种不同的方式?你喜欢哪一种?为什么?
答:有三种方式可以用来创建线程:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。
7,Java支持的数据类型有哪些?什么是自动拆装箱?
答:Java语言支持的8中基本数据类型是:
byte
short
int
long
float
double
boolean
char
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。

2.2 前端基础


1,说说TCP传输的三次握手四次挥手策略
答:为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送 后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志:SYN和ACK。
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。
最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
断开一个TCP连接则需要“四次握手”。
1:第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
2:第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
3:第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
4:第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
2,你觉得前端工程的价值体现在哪?
1:为简化用户使用提供技术支持(交互部分)
2:为多个浏览器兼容性提供支持
3:为提高用户浏览速度(浏览器性能)提供支持
4:为跨平台或者其他基于webkit或其他渲染引擎的应用提供支持
5:为展示数据提供支持(数据接口)
3,栈和队列的区别?
1:栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的
2:队列先进先出,栈先进后出
3:栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除,
4,栈和堆的区别?
1:栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等
2:堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
3:堆(数据结构):堆可以被看成是一棵树,如:堆排序
4:栈(数据结构):一种先进后出的数据结构
5,用过哪些设计模式?
答:工厂模式:
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。 工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例。
function createObject(name,age,profession){//集中实例化的函数var obj = new Object();
obj.name = name;
obj.age = age;
obj.profession = profession;
obj.move = function () { return this.name + ’ at ’ + this.age + ’ engaged in ’ + this.profession; };
return obj; }
var test1 = createObject(‘trigkit4’,22,’programmer’);//第一个实例var test2 = createObject(‘mike’,25,’engineer’);//第二个实例
6,简述一下构造函数模式
使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:
1:构造函数方法没有显示的创建对象 (new Object());
2:直接将属性和方法赋值给 this 对象。

2.3 非技术问题


1,说说你最大的缺点?
回答提示:这个问题企业问的概率很大,通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,企业肯定不会录用你。绝对不要自作聪明地回答“我最大的缺点是过于追求完美”,有的人以为这样回答会显得自己比较出色,但事实上,他已经岌岌可危了。企业喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分,企业喜欢聪明的求职者。
2,你对薪资的要求?
回答提示:如果你对薪酬的要求太低,那显然贬低自己的能力;如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱,他们问你只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。
回答样本一:我对工资没有硬性要求,我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多。
回答样本二:我受过系统的软件编程的训练,不需要进行大量的培训,而且我本人也对编程特别感兴趣。因此,我希望公司能根据我的情况和市场标准的水平,给我合理的薪水。
回答样本三:如果你必须自己说出具体数目,请不要说一个宽泛的范围,那样你将只能得到最低限度的数字。最好给出一个具体的数字,这样表明你已经对当今的人才市场作了调查,知道像自己这样学历的雇员有什么样的价值。
3,你对加班的看法?
回答提示:实际上好多公司问这个问题,并不证明一定要加班,只是想测试你是否愿意为公司奉献。
回答样本:如果工作需要我会义不容辞加班,我现在单身,没有任何家庭负担,可以全身心的投入工作。但同时我也会提高工作效率,减少不必要的加班。
4,最能概括你自己的三个词是什么?
回答提示:我经常用的三个词是:适应能力强,有责任心和做事有始终,结合具体例子向主考官解释。
5,你还有什么问题要问吗?
回答提示:企业的这个问题看上去可有可无,其实很关键,企业不喜欢说“没问题”的人,因为其很注重员工的个性和创新能力。企业不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?企业将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。