Android面试

这篇博客是一位非211本科应届生分享的Android校招面试经历,从8月初开始准备,历经坎坷,最终在网易和美图拿到offer。作者强调了实习经历、项目细节的重要性,以及面试中常见的Android开发题目。博客内容涵盖面试技巧、心态调整,以及面试中遇到的J2EE、数据结构、操作系统等多个方面的技术问题。
摘要由CSDN通过智能技术生成

和大多数的面经不同,我不是大牛,手头也没有3,4个 sp 的 offer 求比较,我只是一个非211,985的本科应届毕业生,想分享一下自己坎坷的求职历程,来给更多求职路上迷茫的应届生一些鼓励,特别是本科应届生。另外还要特别感谢北邮信安研二的赵翔,研三信安的吴博还有清华的金辉,虽然只是做了短短一两个月的同事,但是在之后一直尽其所能的帮助鼓励我。还有研三信安的胡相铎,非常感谢这位大神在技术学习上对我的指导!最后,当然是牛客网这个大平台了,提供的校招信息相当的全面,希望能越办越好!  

  8月初就开始准备校招,一直到10月份下旬,一切都结束尘埃落定了。因为家在深圳而人又在北京,所以我一开始就打算在北京参加校招,找回深圳的工作,真正实践下来,还是相当有难度。我是非985,211的应届本科生,像这种技术岗位,在北京,面临的问题不仅仅是你学校是不是重本的问题,还有很多中科院,清北,北邮,北航,北理工的研究生跟你一起竞争,除非你真的非常优秀,拿过ACM 奖,或者实习经历和项目经历都非常丰富,你的简历才有通过的可能,不然很可能连简历筛选这关都无法通过。如果一些非重本的本科应届生,想要从事技术岗位的工作,一定要好好丰富自己的履历,一个人在学校闷头学和外出实习学习,二者的能学到的东西,比较起来真的差很多。我运气比较好,遇到了相当开明的辅导员和系主任,都表示愿意放我走,于是大三就开始在已经在三星实习。

  非重本的本科应届毕业生,在很多地方都相当受歧视。有些企业点名就只要211的毕业生,比如华为,中兴等等。我现在仍然记得我最受屈辱的一件事情;当时华为在北邮的宣讲会结束,允许宣讲会后找面试官直接投递简历,面试官在收到我的简历后,连我的实习经历都没多看一眼,直接翻到最后找到我学校,然后露出一副鄙夷的态度,把简历打还给我,表示不接受非重本的应届毕业生。我当时心情沮丧到几天都没缓过来,心神恍惚,淋着雨走到了地铁站,连地铁都坐过了站。我几可预见即将到来的2个月是我人生第二个转折,却没想到迎头就摔了一个大大的跟头,2个月之后我会去往哪里,夙愿的offer能否拿到,能否回到家人身边工作,种种矛盾与迷茫,汇集成激流,汹涌而至。

  真正的心态的转变,是从网易的第一通电话开始的,也算是我的第一次面试的开始。感谢北邮人这个平台,让我找到了内推码,才把简历发了出去。网易的内推相当早,基本8月初就已经开始了,大家一定要尽早写好简历,很多好的互联网公司也是从8月份就开始了内推,我个人认为整个内推流程下来,感觉难度和后期参加的BAT,TMD的(头条,美团,滴滴)校招差不多,大家不需要担心难度会很大,最要紧的还是尽早复习,准备好基础知识。

  回到网易的内推上,电话面试其实也有很多坑,并不是所有的面试官都有备而来想好了面试的一系列问题。更多时候他只是想了解你对于项目经历的深入程度,需要你主动的讲解项目经历。我曾经听过在网易电面就挂了的同学的吐槽,他当时在魅族实习,公司规定进行的项目需要保密,当面试官问他项目经历时候,他便回答说这个保密不能说,面试官当场就不高兴了(可能之前电面太多同学了有点累了不耐烦了),觉得他在装逼,没聊10分钟就这同学丧失了兴趣挂了电话。所以大家应该在内推前,应该想好现在在公司的项目,什么该说什么不该说。另外,在你主动讲解项目的时候,不要介绍的太浅,可以仔细聊聊你在项目中遇到的棘手的技术难题或者难以实现的项目需求,你是怎么突破实现的,从而引起面试官的兴趣,引导他在你熟悉的技术上对你发问。我大概和面试官聊了45分钟,顺利通过了第一轮面试。

  第二轮技术面试,因为时间问题赶不到杭州了,我选择了视频面试,短信告知要求使用网易的易信进行视频面试,结果面试过程中各种声音延迟,视频卡顿,面着面着就不得以改成了语音面试,面试官也叫苦连天,真是自己人坑了自己人。第二面时间相当紧,说好的10点半结果拖到11点15才面,可能面试官赶着吃饭,见面还没打招呼问题就上来了,炮弹式发问,答到点上马上就提出下一问题。面试官那里应该有个列表的,照着列表提问,根据回答给予不同程度的评分。都是 Android 开发题目,问题相当的细,当时问了这么一个问题:View中onTouch,onTouchEvent,onClick的执行顺序,如果只是简单的在学校写下 Demo,是很难把这么细的问题回到上来的,只有真正的参与到整个 App 开发流程,才能回答上来。面了45分钟左右,答得七七八八,让我等 HR 通知

  在我很意外的情况下接到了 HR 面,因为等的时间比较长,我几乎都认为我的网易面已经跪了。HR 面也是相当的斗智斗勇,上来让我介绍下我自己,做过什么项目,个人的职业规划是什么,课外兴趣有哪些,手头有别家 Offer 吗,最后难点来了,问我为什么会选择来杭州,家人是否有在杭州的,感觉这个就被卡住了,临时急匆匆撒了个慌,感觉这个地方答得太蹩脚,最后让我说下自己的5个缺点,我以自己可能有些冒失悲观为由跟她讲了一下我参加华为宣讲会简历被拒的经历,她反倒安慰起我,忘记问我后面2个缺点了,不知道要不要感谢华为。一个 offer 就这个到手了  

  拿到网易 offer 后已经是9月底,手头也有一家C 轮的北京创业公司的 offer,可是我还是希望能的找到深圳的工作。与腾讯在北京地区的校招失之交臂后,华为中兴两家虽在深圳,无奈又卡我学历。我虽然顺利通过几家互联网公司的网上笔试,进入面试环节,但是今年互联网寒冬真的来的太猛了,北京地区竞争又激烈,说是百里挑一都不为过了,基本上校招的问题的难度已经和社招没什么区别的,印象最深的还有一道题目,让应用防第三方清理的方法,面试官要求我说至少4种,我脑汁绞尽,除了最基本的双进程守护外,连利用 android 4.1 的系统漏洞获取临时Root权限伪装成系统级应用都说了,才勉强放过我。

  百度在深圳也有Android 开发的岗位,线上笔试虽然过了,但是我投的时候选择的是在北京参加面试,应聘的是深圳地区的岗位。我机缘巧合下得到了深圳地区的 HR 的电话,询问在深圳地区的Android 开发的岗位的情况,她回答我说在其他城市进行校招时已经招满了。我心情瞬间跌到谷底,在北京找回深圳的工作的希望正式宣告破灭了,我下决心回深圳参加社招拼一拼(深圳几乎没有什么校招宣讲会)。

  在深圳海投一波简历后,我也确实通过了不少公司的面试,无奈别人是社招的岗位,需要我立刻上岗工作,我学校还有事情要处理,不可能全职工作的。在这里也给大家提个醒,不到万不得已,不要参加社招,时间上的确合不来,而且企业也更容易毁约,大部分大规模的公司,用人方面都有规定,只允许应届生走校招流程进来。

  就我认为我希望再次破灭之际,突然接到美图公司的电话,我已经说明我是应届生,不能立刻报道,他们说没问题他们这边有校招名额空缺(之前在北邮有宣讲会,没去成),问我方便过来深圳分公司这边面试吗?我一口答应下,第二天到公司后,一路笔试,技术面试,HR 面,CTO 面,轻车熟路过关斩将,下午就收到Offer,可能我之前在三星也是做图像处理类的 App 比较多,技术那边觉得相当符合期望,薪资比之前谈的还要高了一点。瞬间觉得之前受的背运白眼都有了回报,真是苦尽甘来了。

  就在答应过几天去美图签三方了,结果梦寐以求的腾讯突然打电话来技术面试,想起原来是社招的投的简历,问的问题相当有难度,答的磕磕巴巴的,以为没戏了,晚上打电话来又要求到总部面。感觉自己像个快结婚的人了,突然学生时代的初恋女神过来撩拨一下你,明知不可能却又心存侥幸,心情起起伏伏又患得患失,人生的精彩不过如此吧。最后再次与腾讯失之交臂,加入了美图。

  最后分享一下干货,是我在面试美团,今日头条,网易,腾讯等公司时候遇到的面试题,希望能给大家接下来的面试带来帮助!如果我有哪里写得不对的,欢迎知乎私信我!

J2EE 部分: 
1.Switch能否用string做参数? 
在 Java 7 之前, switch 只能支持 byte 、 short 、 char 、 int 或者其对应的封装类以及 Enum 类型。在 java 7 中, String 支持被加上了。

  1. equals与==的区别: 
    ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

  2. Object有哪些公用方法? 
    方法equals测试的是两个对象是否相等 
    方法clone进行对象拷贝 
    方法getClass返回和当前对象相关的Class对象 
    方法notify,notifyall,wait都是用来对给定对象进行线程同步的

  3. 实际开发中软引用或者弱引用的使用场景: 
    利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题 通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用

  4. Hashcode的作用,与 equal 有什么区别 
    同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上

  5. String、StringBuffer与StringBuilder的区别 
    String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 StringBuffer和StringBuilder底层是 char[]数组实现的 StringBuffer是线程安全的,而StringBuilder是线程不安全的

  6. Override和Overload的含义去区别 
    Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。 Override顾名思义就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

  7. 抽象类和接口的区别 
    一个类只能继承单个类,但是可以实现多个接口 接口强调特定功能的实现,而抽象类强调所属关系 抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

10.解析XML的几种方式的原理与特点:DOM、SAX、PULL 
DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机 
SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。 
SAX:与 SAX 类似,也是基于事件驱动,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。 
11.wait()和sleep()的区别 
sleep来自Thread类,和wait来自Object类 
调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁 
sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU 
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒 
13.JAVA多态的实现原理 
抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM 通过参数的自动转型来找到合适的办法。

14.JAVA 垃圾回收与内存分配策略 
14.1 垃圾回收是什么?

就是释放那些不再持有引用的对象的内存

14.2怎么判断一个对象是否需要收集?

引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程
对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集 
引用计数缺陷:引用计数无法解决循环引用问题:假设对象A,B都已经被实例化,让A=B,B=A,除此之外这两个对象再无任何引用,此时计数器的值就永远不可能为0,但是引用计数器无法通知gc回收他们 
14.3 Java的四种引用的区别

强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。 
弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象 
虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。 
14.4 介绍垃圾回收机制

标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片 
标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率 
复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。 
分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法 
14.5 JAVA 中堆和栈的区别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值