眼看着时间一天一天地过去,距离金九银十也就二十多天的日子了,还有多少程序员是两眼摸黑不知道面试要做哪些准备的朋友?
还不知道进大厂需要复习哪些资料的朋友可以看过来,知道有些朋友会没什么准备跟无头苍蝇一样所以博主早在一个月前就已经在各大网站和教育平台收集了大量面试相关的资料了,最终取其精华去其糟粕总结出了这份秋招Android面试必看手册。
为了预防大家遇到以下这些非技术问题,不知道怎么回答的完美,在这里小编也浅浅的分享一下回答的思路和方向。希望能对大家的面试起到一定的帮助!!
非技术问题
自我介绍
您好,很荣幸有机会来参加公司的面试
- 个人经历(我是谁,我来自哪里,年龄,学历,从业经历)实习加上正职
- 公司为什么要选你(应聘岗位中最重要的3个技能点,说清楚相关经验)我能做好我要做的事情,我相信自己
- 你为什么要选这家公司(就公司的产品,文化,影响力等)着重说出你选择的理由如贵公司的高技术开发环境很吸引我,贵公司在近年来市场上很有竞争力,贵公司能够提供一个与众不同的发展道理
高频问题
1、上一家公司,你为什么会离职?
公司很好,但是公司调整了业务,接下来的发展路线和自己的目标不一致,所以要换工作工作太清闲,学不到知识,我不怕累,就是想多锻炼自己,想找具有挑战力工作公司的管理制度不也是很完善,没有晋升机会,我比较想进步,找一个更好的平台我想去优秀的公司,让自己变得更好。
2、为什么来我们这里?
对原单位充满感恩,这是我人生中非常重要的经历,我认同原单位领导和文化两份工作的本质是一致的,行业和工作性质都有紧密联系选择一份新的工作不代表背叛过去,发扬原公司魅力,同时为了寻求更大的成长和突破不承诺一份工作干一辈子,保证在我的任期内尽职尽责
3、你怎么看待自己以后的职涯?(包括工作和家庭的分配,怎么平衡家庭和工作的关系、加班、选择一家公司时的考量、地点等)(离职稳定性)
我准备在技术领域有所作为,我希望在我3到5年内,具备什么样的素质,在行业内达到什么样的水平,产出什么样的工作成果,将规划量化,具体化
4、对薪资期望(不要直接说数,绝不能表现出没到多少钱或者什么层级我就不去)
薪资应该基于你求职行业的市场价格和自身的价值,例如目前这个岗位的平均工资是8K,虽然我刚毕业,但是在我工作期间已经有过两份的相关经验而且都是作为核心成员参与项目,因此可以很快上手这份工作,所以我希望能够在转正后的工资能达到10K等等。
5、可以接受降薪吗?(先了解公司薪酬体系,根据行业和自身能力来定位)
如果候选人的调性符合(足够官方),可以这么回答:我也了解咋们公司现在的薪资架构,我相信公司会根据我的能力给出一个合理的薪水方案,我相信只要把事情做好,该有的一定会有的对于这样的部门,“ 毕竟贵公司在做一个从来没有人做的这么好的事情,所以肯定是有难度的,肯定是要付出大量努力的 ”
6、自己觉得自己工作上的短板/优点是什么?
不能避而不谈,不能变相夸自己,不能暴露重大缺陷,可以将一些能接受能改进的缺点 综上:缺点加说明加改进
7、说说自己性格上的优缺点(描述一下自己的性格)
我不懂得如何拒绝他人,我拉不下面子去指出别人的问题,我做事的时候希望马上就能看到成效,有时候会比较贪心,想同时做好几项工作,我比较慢热,不善于和陌生人打交道,我有意识的让自己在改正,让自己更加有亲和力,我非常在意别人对自己的工作评价,得不到好评就会焦虑,其实我也在开导自己别太功利心了。沉着冷静,条例清楚,立场坚定,顽强向上,乐于助人和关心他人,适应能力等等
8.怎么看待加班(你能接受996、997、007吗)?
- 可以接受版本 如果候选人的调性符合(足够官方),可以这么回答:我觉得我们要实现梦想,一定是要付出比较多努力的,所以我已经做好了准备,也愿意和小伙伴们一起战斗我是可以加班的,我现在加班强度就是比较大的。因为我喜欢这个事情,我想把这个事情做好。项目忙的时候可能一个月都没有休息日,我觉得要应对这么忙的工作,光有心理准备其实还不够,还要有特别好的身体素质,所以我准备把健身的习惯一直坚持下去
- 不接受版本 加班是应该的,不加班也是应该的,没有把事情做完是不应该的,因为能力低完成工作慢造成的加班,并不是一件好事,不加班是能力,加班是态度,能力不够的情况下,态度去补。
9、你谈恋爱了没?(状态是否稳定,会不会因为感情影响工作,很快结婚,休婚假产假)
我还没有谈恋爱,目前不考虑恋爱问题,我希望自己变得更优秀以后,在谈一场稳定的恋爱,所以现在想把主要的精力放在工作上。
我已经有男朋友或女朋友,我们都在这个城市工作,目前准备先工作几年,有精力能力了在考虑结婚。
10、是否还面试其他公司(HR确认求职意向与诚信度)
实话实说,选择名声较大较好的公司来说,职位和现在的求职相思相近,表是自己求职意向专一,还在等候结果
11、项目中遇到的最大挑战是什么?怎么解决的?
因人而已,需要描述问题产生的原因,查找解决问题的方式,对比那种更加好,遇到什么问题,最终怎么一步一步解决的
12、最有成就感的事情是?
做有挑战性的事情,并且能够做好,或者是坚持一个习惯很久,如坚持写博客,坚持看书
13、你有什么问题想问的?
- 你作为一个资深的CODER,我想知道,你平时是怎么学习技术,有什么好的学习途径,怎么才能做到像你一样强呢?
- 公司的业务和技术栈是什么呢?
- 技术难点怎么解决,有什么技术支持
- 每天有多少时间花在写代码上
14、收到OFFER该问的5个问题
- 试用期工资和时间(正常来说合同是3年,试用期是3个月)
- 转正考核的方式,转正工资
- 工作时间以及加班计算(一周五天工作制,一天8小时)
- 培训晋升机制
- 福利情况(五险一金,餐补,其他补贴如电脑补贴)
技术问题
一、抽象类与接口的区别?
1、抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法; 2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的; 3、接口中不能含有构造器、静态代码块以及静态方法,而抽象类可以有构造器、静态代码块和静态方法; 4、一个类只能继承一个抽象类,而一个类却可以实现多个接口; 5、抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法; 6、如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 7、如果你往接口中添加方法,那么你必须改变实现该接口的类。 8、接口更多的为了约束类的行为,可用于解耦,而抽象类更加侧重于代码复用。
二、Java 中深拷贝与浅拷贝的区别?
1、浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝, 此为浅拷贝。 2、深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
三、谈谈Error和Exception的区别?
1、Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。 2、Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这 种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。
四、什么是反射机制?反射机制的应用场景有哪些?
Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 应用场景:1. 逆向代码,例如反编译
- 与注解相结合的框架,如 Retrofit
- 单纯的反射机制应用框架,例如 EventBus(事件总线)
- 动态生成类框架 例如Gson
五、谈谈你对Java泛型中类型擦除的理解,并说说其局限性?
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。局限性:如在代码中定义的List和List等类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM 来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。
六、能具体说说是怎么导致死锁的吗?
在 POSIX 标准中,fork 的行为是这样的:复制整个用户空间的数据 (通常使用 copy-on-write 的策略,所以可以实现的速度很快) 以及所有系统对象,然后仅复制当前线程到子进程。这里:所有父进程中别的线程,到了子进程中都是突然蒸发掉的对于锁来说,从 OS 看,每个锁有一个所有者,即最后一次 lock 它的线程。假设这么一个环境,在 fork 之前,有一个子线程 lock 了某个锁,获得了对锁的所有权。fork 以后,在子进程中,所有的额外线程都人间蒸发了。而锁却被正常复制了,在子进程看来,这个锁没有主人,所以没有任何人可以对它解锁。 当子进程想 lock 这个锁时,不再有任何手段可以解开 了。程序发生死锁
七、MMAP的内存映射原理了解吗?
MMAP内存映射的实现过程,总的来说可以分为三个阶段: (一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域
- 进程在用户空间调用库函数mmap,原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
- 在当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址
- 为此虚拟区分配一个vm_area_struct结构,接着对这个结构的各个域进行了初始化
- 将新建的虚拟区结构 (vm_area_struct) 插入进程的虚拟地址区域链表或树中
(二)调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系
- 为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描 述 符,通过文件描述符,链接到内核“已打开文件集”中该文件的文件结构体 (struct file) , 每个 文件结构体维护着和这个已打开文件相关各项信息。
- 通过该文件的文件结构体,链接到file_operations模块,调用内核函数mmap,其原型为: int mmap(struct file *filp, struct vm_area_struct *vma),不同于用户空间库 函数。
- 内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘物理地址。
- 通过remap_pfn_range函数建立页表,即实现了文件地址和虚拟地址区域的映射关系。此时,这 片 虚拟地址并没有任何数据关联到主存中。 注:前两个阶段仅在于创建虚拟区间并完成地址映射,但是并没有将任何文件数据的拷贝至主存。 真正的文件读取是当进程发起读或写操作时。进程的读或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址并不在物 理页面上。因为目前只建立了地址映射,真正的硬盘数据还没有拷贝到内存中,因此引发缺页异常。
(三)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝 注:前两个阶段仅在于创建虚拟区间并完成地址映射,但是并没有将任何文件数据的拷贝至主存。真正的文件读取是当进程发起读或写操作时。进程的读或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址并不物理页面上。因为目前只建立了地址映射,真正的硬盘数据还没有拷贝到内存中,因此引发缺页异常。
- 缺页异常进行一系列判断,确定无非法操作后,内核发起请求调页过程。
- 调页过程先在交换缓存空间 (swap cache) 中寻找需要访问的内存页,如果没有则调用nopage 函 数把所缺的页从磁盘装入到主存中。
- 之后进程即可对这片主存进行读或者写的操作,如果写操作改变了其内容,一定时间后系统会自动回写脏页面到对应磁盘地址,也即完成了写入到文件的过程。
注 :修改过的脏页面并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync()来强制同步,这样所写的内容就能立即保存到文件里了
八、简述下Handler机制的总体原理
- Looper 准备和开启轮循: Looper#prepare()初始化线程独有的 Looper 以及 MessageQueue Looper#loop()开启死循环读取 MessageQueue 中下一个满足执行时间的 Message 尚无 Message 的话,调用 Native 侧的 pollOnce()进入无限等待存在 Message,但执行时间 when 尚未满足的话,调用 pollOnce()时传入剩余时长参数进入有限等待
- Message 发送、入队和出队: Native 侧如果处于无限等待的话:任意线程向 Handler 发送 Message 或 Runnable 后,Message 将按照 when 条件的先后,被插 入 Handler 持有的 Looper 实例所对应的 MessageQueue 中适当的位置。 MessageQueue 发现有合适的 Message 插入后将调用 Native 侧的 wake() 唤醒无限等待的线程。这将促使 MessageQueue 的读取继续进入下一次循环,此刻 Queue 中已有满足条件的 Message 则 出队返回给 Looper Native 侧如果处于有限等待的话:在等待指定时长后 epoll_wait 将返回。线程继续读取 MessageQueue, 此 刻因为时长条件将满足将其出队 Looper 处理Message 的实现:
- Looper 得到 Message 后回调 Message 的 callback 属性即 Runnable,或依据 target 属性即 Handler,去执行 Handler 的回调。存在 mCallback属性的话回调 Handler$Callback 反之,回调 handleMessage()
九、system. server为什么要在Zygote 中启动,而不是由init 直接启动呢?
Zygote 作为一个孵化器,可以提前加载一些资源,这样fork) 时基于Copy-On-Write 机制创建的其他进程就能直接使用这些资源,而不用重新加载。比如 system. server就可以直接使用Zygote 中的JNI 函数.共享库、常用的类、以及主题资源。
十、Binder机制是如何跨进程的
1.Binder驱动 1.1 在内核空间创建- 块接收缓存区, 1.2 实现地址映射:将内核缓存区、接收进程用户空间映射到同一接收缓存区 2.发送进程通过系统调用(copy. from_ user) 将数据发送到内核缓存区。由于内核缓存区和接收进程用户空间存在映射关系,故相当于也发送了接收进程的用户空间,实现了跨进程通信。
由于文章篇幅有限,不能将我整理的所有面试题全部展示出来,不过也没关系,我已经将所有的面试题整理成PDF文档了
有需要完整面试题和答案解析的朋友可以点击下方课程链接详细了解!!!
https://edu.51cto.com/course/32703.html
最后
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。