1. 挑战公司No.1:上海创梯信息科技有限公司

公司地址:上海杨浦区昆明路1209号尚凯大厦副楼504室

面试时间:5月12日 10:00 AM. 面试结果:顺利砍下Android技术总监,15K offer 面试过程: 10:00 到公司,前台MM给了张面试人员登记表,10分钟搞定表格。 10:30 由于公司BOSS正在面试其他人,因此,又等了几分钟。 10:40 在BOSS办公室与BOSS斗智斗勇,聊了有接近1个小时。

疯狂的笔试+面试记录(前方内容“高能”:funk:,请准备高度精神集中前行):

1. 笔试

由于BOSS正在打造公司新业务,刚刚开始组建公司技术团队,公司没有人懂IT技术,故本次面试没有笔试题,额

2. 面试过程问答精选:

旁白:进入办公室后,我淡定等待,约莫几分钟后,一位35岁左右,看起来非常老道的BOSS走了进来。几句寒暄之后,问了我一些关于我的学校、专业、工作经验、接触的Android项目等普通流水线式的没有营养问题,轻松搞定!接着,BOSS终于切入到了重点:

BOSS问:其实我们想做一个快递业务的APP,类似于滴滴打车。用户如果想要寄快递,只需要打开APP,查找附近都有哪些快递员,然后直接跟附近的快递员联系。如此,既能方便用户,又能提高快递员的收入。

我(阳哥)答:我有一个问题想要问一下,咱们公司(注意,一定要说“咱们”,让别人感觉你已经融入他们的公司团队了)不像顺丰,不是典型的物流公司,为什么我们要做快递类的APP呢(主动沟通交流,有问题就问,这样面试官才能跟你聊起来!)?

BOSS答:你知道的那些物流公司现在都是各自为政。例如,你用顺丰快递,你可以下载个顺丰的APP。但是,你以后可能还要用中通、申通、圆通等等这些物流公司,难道你要下载十几个APP吗?而我们要做通用的快递类APP!

BOSS问:你知道一个APP重要的是什么吗?

我(阳哥)答:用户体验!

BOSS说:不对,是流量,也就是用户数量(好吧,阳哥作为技术屌丝,关注多的就是APP用户体验,所以,不敢去反驳他,先顺着他的意思来)。

BOSS问:如果让你去做一个类似于滴滴打车的APP,你认为自己做的出来吗?

我(阳哥)答:像滴滴打车这样的APP,不仅仅只是客户端的问题。它不是由几个简单的客户端程序员就能做出来的,实际上,它应该是由一个技术团队完成的大型项目。您目前能够看得见的仅仅是用户客户端,看不见的是庞大的后台系统。说详细点就是:滴滴打车这样的项目应该分3部分:服务器端,用户客户端,出租车司机客户端。服务部端考虑的是数据的存储,业务的调度处理,以及与各个客户端的数据交互。而用户客户端我个人理解主要是一个UI的显示和与用户数据交互的功能。比如,用户将自己的当前坐标发送到服务器端(当前坐标可以通过百度地图、高德地图获取),服务器根据用户的坐标查找附近的所有空闲状态的出租车,然后将用户的用车需求推送到出租车司机客户端端。出租车司机接收到信息后,如果愿意接这笔单子,就向服务器发送同意信息。服务器就是作为一个中介将用户与出租车司机联系起来。大概逻辑就是这样一个过程,中间的技术细节比较多。总之,一个人做滴滴打车是不太现实的(大家可以看出来,这一段,阳哥是傻瓜式教学,没有说的太复杂,好让BOSS能够听明白。不然,技术说的太深,BOSS就不知道说什么了,还怎么聊的开心。面试的最终目的就是让对方觉得看你很顺眼,这是关键!)。

(顺便啰嗦一下,黑马的Android课程中有部分JavaWEB课程。我们做为APP开发人员,不管是服务器端还是移动端都应该有所了解。如果仅仅会移动端开发技术而不懂服务端知识,长久看来,确实会很影响Android程序员向更高层次发展。)

BOSS问:那么,如果我让你负责客户端的开发呢?

我(阳哥)答:客户端Android开发并不难,比如支付宝是一个很强大的金融系统。但是,你让我做它的Android端开发,我感觉我没问题。毕竟,Android客户端重点是信息的展示和与用户的交互。所以一个人做客户端是没有问题的。但是,目前市场上的企业很少有一个人做一个客户端项目的。市场竞争如此激烈,一个人做耗时太长,可能你还没有做出来,产品已经被淘汰了。因此,应该多招几个Android程序员,这样团队就算有人员流失也不会影响整个公司的发展(展示自己对于项目组人数把控的个人看法)。

旁白:几轮PK下来,BOSS基本上对我已经很信服了。

BOSS说:其实,在面试你之前,我已经招聘到了两个移动开发的程序员,一个是Android程序员(6K),一个是iOS程序员(8K),你可以看一下他们两个的面试登记信息和他们的简历。

我(阳哥)问:根据这两份简历可以看出来,这两个人的技术有些一般(不是装逼,他们的简历写的确实有点LOW)。

BOSS问:是的,我看的出来,你的经验要比他们丰富地多。所以,我准备让你出任我们公司的技术总监,带着他们两个做客户端开发,你认为你有信心做好吗?

我(阳哥)答:这个职位我以前没有做过,所以心里没有多大的底(阳哥认为这样的问题确实比较考验人,你直接回答“可以,没问题”,就会显得你浮夸、不谨慎、办事不牢靠。如果你直接回答“不能”,又显得你不敢担当,没有上进和挑战的精神。因此回答这样的问题必须两者兼顾,既要谦虚谨慎又要表现出富有挑战精神)。

BOSS说:我知道你没有做过,但是,一个人挑战任何一样新工作之前都是没有做过的。你有没有想过一旦你能够胜任我们的公司的技术总监,你以后的身价将和现在完全不同,所以,对自己要有一些信心(BOSS故意画大饼,就说明你有戏了!)。当然,这是一个管理岗位,需要什么样的技术人员你可以招。

我(阳哥)说:好吧,其实我希望挑战一下,但是我不一定能够达到您对我那么高的期望(始终保持谦虚的态度很重要!你的态度决定别人对待你的态度!)。 BOSS问:你尽力就好,请问你的期望月薪是多少?

我(阳哥)答:15k(第一次面试,我心里也不太清楚上海的市场,15k一般是黑马班里的大神级同学要的薪资,所以,试水一下)。

BOSS说:好的,没问题(竟然没有砍价:L,额,土豪公司)。

旁白:随后,阳哥又和BOSS聊了一些其他内容,由于BOSS马上要开会,就告诉阳哥如果你同接受我们的邀请,那么我希望我们明天下午可以好好聊聊。。。。之后,一堆寒暄,不列出来了。虽然,第一家面试就这样结束了,没有技术上太多的PK。但是,却使阳哥在精神上却得到了巨大的鼓励,面试第二家上海公司有了更大的信心!

面试吐槽

阳哥的上海处女面就这样丢掉了!遗憾的是BOSS不太懂技术,没有碰撞出技术的火花。但是,让人幸运的是他提供给我了一个技术总监的岗位。整个过程可以看到,面试的时候,面试官一方面会明中考察我们的技术。另一方面,在暗中实际上也在考察我们的沟通能力、思维逻辑能力、管理能力等这些软实力。所以,黑马的每一位达人,在黑马拼命码代码的同事,别忘了多和你的小伙伴分享技术,不要忘记中午的时候抓住每一次的公开演讲机会。有时候,一个人综合实力远大于单纯的技术竞争力!加油吧,骚年们!

2. 挑战公司No.2:上海复深蓝信息技术有限公司

公司地址:上海市徐汇区漕河泾开发区虹梅路2007号1号楼

面试时间:5月12日 14:00 PM. 面试结果:顺利砍下Android工程师,17K offer+1K补助 = 18K 月薪:victory: 面试过程:

14:00 到公司,前台MM给了一张面试登记表和一张Android笔试试题,然后一位和蔼的大叔(技术大拿)将我带公司接待处,让我开始笔试。

14:20 笔试完成,笔试很简单,做完后把试题交给前台,前台帮我联系面试官。 14:25 跟一个年龄大概在25~30岁之间的年轻技术官进行了接近1个小时的面试(通过交谈阳哥感觉面试官应该是项目经理或者开发组组长)。

15:20 人事面试,人事面试后提前跟我说CTO会对我进行一个电话复试。

第二天晚上大概19:00,公司CTO对我进行了技术复试,总共持续了31分钟。电话复试题要比初试难的多了,姜还是老的辣。我把复试的对话录音保存下来了,作为以后上海黑马就业指导课程的案例讲解(内容何止“高能”,简直就是高达!)。

疯狂的笔试+面试记录(前方内容“残酷”:funk:,请准备受虐心态前行):

1. 笔试

笔试时出现了一个小插曲,和大家分享一下。阳哥笔试所在的接待区是一个半开放式的区域,共有3张桌子,每张桌子上都有一支签字笔。我先用第一张桌子,发现笔是坏的(郁闷),然后换到第二张桌子,发现笔还是坏的(心想:尼玛,这么霉,顺便汗一下),最后只能换到第三张桌子,你猜怎么滴,对,笔还是坏的(想要骂娘了,FUCK!)。没辙了,翻遍我的背包,自己也没带笔。难道企业是用这种方式考察一个应聘者的吗?这怎么办?

我想去前台借吧,前台肯定有(不要去人事那里借,前台毕竟只是前台,不会管你太多的细节,人事可就不一样了,他们会认为一个面试者来比试不带笔是极不严肃的表现)。热心的前台MM很乐意地把自己的笔借给了我(心里一阵暖啊!这家必须拿下!)。

为了方便大家更清晰的看到笔试题目,阳哥手录笔试题和答案,看你能做对多少?! Q:Android的四大组件有哪些? A:Activity、Service、ContentProvider、BroadcastReceiver。

Q:请描述下Activity的生命周期? A:onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。

Q:如何将一个Activity设置成窗口模式? A:将Activity的样式设置成:android:theme=”@android:style/Theme.Dialog

Q:如何退出Activity?如何安全退出已调用多个Activity的Application? A:调用Activity的finish方法可以退出当前Activity。可以自定义一个Application,在Application中声明一个成员变量ArrayList用于存放打开的Activity,当退出时遍历ArrayList,依次调用Activity的finish方法。

Q:请介绍下Android的五种布局。 A:LinearLayout、RelativeLayout、FrameLayout、RelativeLayout、TableLagout

Q:请介绍下Android的数据存储方式。 A:SharedPreference、XML、SQLite、文件系统

Q:DDMS和TraceView的区别。 A:DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。TraceView是程序性能分析器

Q:说说Activity、Intent、Service以及他们之间的关系。 A:Activity负责界面的显示和用户的交互,Intent封装了数据,可以实现Activity之间以及Activity和Service之间数据的传递。Service运行在后台进程,一般我们会让给其运行一些后台任务,Activity通过StartService(Intent)或者BindService(Intent)可以启动Service。

Q:请介绍一下ContentProvider是如何实现数据共享的。 A:我们可以定义一个类继承ContentProvider,然后覆写该类的insert、delete、update等方法,在这些方法里访问数据库等资源。同时将我们ContentProvider注册在AndroidManifest文件中,其他应用需要使用的时候只需获取ContentResolver,然后通过ContentResolver访问即可。

2. ROUND 1:PK项目经理技术面试问答精选

项目经理问:Activity都有哪些生命周期? 我(阳哥)答:这个问题其实在笔试题中我已经给出答案了(此时,阳哥表示非常疑惑~)。 项目经理说:我知道,你再说一遍。

旁白:当时阳哥我真没搞明白,为何笔试上的题目他还是问我一遍,而且笔试上的好几道题他都重复问了一遍。现在想想应该是他怀疑我笔试的时候作弊了,比如我可以百度什么的。好吧,我不就是笔试的时候出去跟前台妹子借了一支笔,然后又把笔试题给拍了个照片而已嘛。而且,我那3G的联通定制机安装的移动4G的卡,只能享受2G的网速,我打开个百度都得几分钟。算了,不能和面试官较劲!我忍!

我(阳哥)答:Activity有以下生命周期回调方法,比如常用的有onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。默认情况下,如果我们不给Activity设置横竖屏配置信息的话,在横竖屏切换时会将一个Activity销毁掉然后重新创建。 项目经理问:Fragment你用过吗?

我(阳哥)答:这个当然用过呀。现在的应用中基本都有Fragment的应用,Fragment比较小巧灵活。

项目经理问:那Fragment跟Activity之间是如何实现值传递的?

旁白:其实项目经理在问我会不会Fragment的时候,我已经预料到接下来会问我Fragment跟Activity直接的值传递问题。对于前面的问题,如果我说不会,就不会有下面的问题,但是如果说不会的话,那么项目经理很可能因为这一个问题而把我PASS掉,因为Fragment是Android中一个非常重要的知识,这个是必须会的(黑马的Android基础课程中有一天就是讲Fragment的)。如果连这个都不会,那么再好的面试技巧也挽救不了同学们的!

我(阳哥)答:Activity可以先获取FragmentSupportManager或者FragmentManager,前者是v4包下的,向下兼容因此用的比较多。然后这些Manager通过Fragment的tag或者id调用findFragmentByTag(“tag”),findFragmentById(“id”)找到我们需要的Fragment对象,然后通过调用Fragment对象的方法来进行值的传递。

项目经理问:Android中都有哪些组件需要在清单文件中注册?

旁白:四大组件是学习Android的必会知识点,也是黑马Android基础中的重点内容,因此这个问题同学们其实应该是很好回答的!

我(阳哥)答:一般来说四大组件都需要在AndroidManifest.xml中进行注册,不过其中Activity、Service、ContentResolver是必须注册的,而BroadCastReceiver可以在清单文件中注册,也可以不注册,这也分别叫做静态注册和动态注册。

旁白:在Android中一般通过XML文件注册的组件,我们叫静态注册,而通过代码注册或者创建的组件我们叫做动态注册。动态注册和静态注册这两个名称听起来很高大山,其实理解起来so easy滴!

项目经理问:你自己有做过自定义控件吗?

我(阳哥)答:自定义控件做过,比如我们项目中的SlideMenu,LazyViewPager,Pull2RefreshListView,VerticalSeekbar,RandomLayout等都是自定义控件。 项目经理问:那你说说View的绘制过程?

我(阳哥)答:View绘制是从根节点(Activity是DecorView)开始,他是一个自上而下的过程。View的绘制经历三个过程:Measure、Layout、Draw。

旁白:黑马的老版本课程体系中有2天的自定义控件,在这两天课程中同学们能够学会SlideMenu,Pull2RefreshListView,优酷菜单等自定义控件,目前的黑马课程又对自定义控制进行了加强,添加了多种QQ5.0新特性内容,当然难度其实也不小。

项目经理问:ListView你们应该有用过吧?

我(阳哥)答:这个在我们的项目中应用的很多,其实在如今所有流行的App中,ListView都有一个大量的应用,说ListView是一个使用率高的控件都不为过。

项目经理问:ListView的优化你们是怎么做的?

我(阳哥)答:ListView的优化有多种多样的策略。在我们的项目中主要做了如下优化。1、重用ConvertView,2、给ConvertView绑定ViewHolder,3、分页加载数据,4、使用缓存。前两个是通用的解决方案,后两个是针对我们业务的个性化解决方案。我们的数据来自服务端,如果服务端有1000条数据的话,我们客户端不可能傻瓜式的一次性用ListView把这些数据全部加载进来,因此我们就用分页加载数据,每次加载20页,当用户请求更多的时候再获取更多数据,网络的访问就算网速再快也多多少少会有一定的延迟,因此我们的网络请求是异步处理的,同时从网络加载来的数据使用了2级缓存来处理,第一级是内存级别的缓存,第二级是本地文件的缓存。当ListView加载数据的时候首先从内存中找,如果找不到再去本地文件中找,只有都找不到的情况下才去请求网络。

旁白:ListView的优化是黑马课程一个重要的知识点,因此大家上课的时候这个必须得学会,不然在以后的面试中肯定会栽跟头的。

3. ROUND 2:第二轮PK CTO(非人类)技术面试问答精选

旁白:第二轮技术复试是在第二天晚上7点时开始的,当时,阳哥我刚从外面面试完回到家中。跟我聊的是他们公司的CTO,通过聊天也能感受到他的技术非同寻常,前几个问题问我时感觉多方有种咄咄逼人的气势(貌似面试的人太多了,对于被面试人员都是不屑的口气)。不过几轮技术PK后,发现原来CTO对人类也可以这么温柔和气的(尼玛,技术好才能被人看得起啊!心底话!)。

CTO问:说说你对泛型的了解?

我(阳哥)答:泛型是jdk5.0版本出来的新特性,他的引入主要有两个好处,一是提高了数据类型的安全性,可以将运行时异常提高到编译时期,比如ArrayList类就是一个支持泛型的类,这样我们给ArrayList声明成什么泛型,那么他只能添加什么类型的数据。第二,也是我个人认为意义远远大于第一个的就是他实现了我们代码的抽取,大大简化了代码的抽取,提高了开发效率。比如我们对数据的操作,如果我们有Person、Department、Device三个实体,每个实体都对应数据库中的一张表,每个实体都有增删改查方法,这些方法基本都是通用的,因此我们可以抽取出一个BaseDao,里面提供CRUD方法,这样我们操作谁只需要将我之前提到的三个类作为泛型值传递进去就OK了。而数据的安全性,其实程序员本身通过主观意识是完全可以避免的,何况某些情况下,我们还真的想在ArrayList中既添加String类型的数据又添加Integer类型的数据。

CTO问:你知道Java的继承机制吗?

我(阳哥)答:知道呀,这个问题很简单呀!java是单继承多实现呀。

CTO问:那你知道java为何这样设计吗?

旁白:从上面的问题也可以看出越是资历老的程序猿越喜欢刨根问底,因此如果同学们面试的时候遇到一个年龄稍微大点的程序员,那么一定要提前做好思想准备了,他可能先问你一个看似很简单的问题,然后再追问一个很深的思想或者原理。

我(阳哥)答:为何Java这样设计,其实这也是我一直的一个小疑惑。不过我是这样理解的。我只能用反证法,如果一个类继承了类A和类B,A和B都有一个C方法,那么当我们用这个子类对象调用C方法的时候,jvm就晕了,因为他不能确定你到底是调用A类的C方法还是调用了B类的C方法。而多实现就不会出现这样的问题,假设A和B都是接口,都有C方法,那么问题就能解决了,因为接口里的方法仅仅是个方法的声明,并没有实现,子类实现了A和B接口只需要实现一个C方法就OK了,这样调用子类的C方法时,Java不至于神志不清。从另外一个方面考虑的话应该就是Java是严格的面向对象思想的语言,一个孩子只能有一个亲爸爸。

CTO问:Java的异常体系你知道吗?

我(阳哥)答:知道呀,顶层是Throwable接口,往下分了两大类,一个RunntimeException另一个是普通的Exception。

CTO问:那你知道这两类异常的区别吗?

我(阳哥)答:当然知道,java的命名是见名知意的。从名字上我们也知道RunntimeException就是运行时异常,在运行的时候才能被jvm发现导致程序的终止,而普通Exception必须进行try、catch处理,或者在方法上用throws声明。

CTO问:那你的期望薪资是多少?

我(阳哥)答:我期望的薪资已经给贵公司人事说过了,是17k。

CTO问:你这么年轻,就想要到17k呀!

我(阳哥)问:对的,我是还年轻,高中同样是学习3年,有的考上了重点大学,有的却只考上了个大专院校,甚至落榜,不同的人学习能力是完全不一样的,甚至可以用天壤之别来形容,因此如果只简单的用时间来衡量一个人的价值显然就是不太合理的,比尔盖茨跟我这样大年龄的时候已经是亿万富翁了,而我还在找17、18k薪水的工作(前面的问题已经回答的这么漂亮了,谈薪水的时候一定要表现出绝对的自信!)。

CTO问:你说的对,不过我还得问你几个问题,你说你们项目中有用到图片吗?

我(阳哥)答:这个当然有呀,我们新闻客户端基本上每条新闻都有图片,只有图文并茂的新闻才会有人看。

CTO问:那你说你们遇到OOM异常吗?

我(阳哥)说:这个前期的时候我们的APP确实遇到过这样的问题,不过现在新的版本早就吧这些问题给解决了。

CTO问:那你们是怎么解决的?

我(阳哥)答:OOM异常是Android中经常遇到的一个问题,程序员稍微不注意可能就导致其产生。因为Android的每一个应用都是一个Davlik虚拟机,该虚拟机的默认堆内存只有16M,远远无法跟我们的PC机比较,因此和容易导致OOM(Out Of Memory)异常的产生。导致这样的异常主要有以下原因:1、加载大图片或数量过多的图片,因为图片是超级耗内存的,2、操作数据库的时候Cursor忘记关闭,3、资源未释放,比如io流,file等,4、内存泄露。我们用用的OOM主要是加载图片导致的。因为后面的三种原因都是可以通过约束程序员的编码规范来进行预防,或者使用性能分析工具来检查。

CTO问:好的,那你们的图片是怎么处理的?

旁白:随后这就是CTO面试应聘者的一个习惯,他会追着一个知识点往死里问,直到问到系统的底层,或者他能理解的底。

我(阳哥)答:图片的处理主要用两种方式。我们的应用中有两处用到了图片,一个是ListView中展示的图片缩略图,这种情况的特点是数量大,但是单个图片内存小,只有几kb,另外一种是大图片,就是用户通过手机拍摄的图片,然后通过http的post提交的方式提交到服务器上。然后在客户端将这个大图片也展示出来。对于第一种情形,我们是通过三种技术手段来解决问题的,一是图片的缓存策略,二是ListView的优化,其实在上面我已经讲过,三是WeakRefrence(弱引用)的使用。对于第二种情形,我们主要是首先通过BitmapFactory.Options参数获取图片的宽和高,然后再根据我们ImageView的宽高对图片进行一个很大比例压缩。

CTO问:那你说说弱引用是怎么使用的?

我(阳哥)答:WeakRefrence是一个类,在ArrayList中我们把这个类作为对象传递进去,把我们的图片放在WeakRefrence里面,这样当davlik虚拟机内存不够用的时候,就会把WeakRefrence对象回收掉,这样我们在WeakRefrence里面保存的数据也被回收了。

面试吐槽

阳哥在上海的第二面终于遇到懂技术的人,把笔试、技术一面、人事、技术二面一气呵成的通了个关,不拖泥带水,最终人事给了基本薪资17k+1k多补助的offer,这种感觉也许只有你经历过了才能体会吧!相信黑马学子经过四个月的刻苦磨练也能远远超过我的水平。加油吧,骚年们!

这家公司所在楼有两层是高德地图的!

阳哥冒死偷拍的笔试题!

阳哥录用通知邮件!

3. 挑战公司No.3:中阜投融资产管理股份有限公司—-中投融

公司地址:上海市静安区威海路228号招商局广场南楼21楼

面试时间:5月12日 16:30 PM. 面试结果:顺利拿下Android工程师,15K offer+1k住房补贴=16k:victory: 面试过程:

16:30 到公司,因为这一天安排了3家面试,这家本来是安排的16:00的,但是迟到了半个小时,不过企业招人都比较急,这个可以理解。 16:30~16:40 填写面试登记表,这家没有笔试题,填完后坐在公司前台附件的沙发上等了几分钟,桌子上放了一盘水果糖,诱人,也不敢吃,哈哈。 16:40~17:15 跟一位Android程序员进行第一轮PK。 17:20~17:50 跟项目经理进行第二轮PK。 17:50~18:00 跟人事谈薪资。

疯狂的笔试+面试记录(前方内容“高能”:funk:,请准备高度精神集中前行):

1. 笔试

这一家没有笔试题,其实阳哥发现一个规律,一般Android开发团队刚刚组建的,或者Android开发人员不多的企业基本都没有笔试这一环节,这可能是他们公司的Android开发团队各方面还没有形成一套标准的流程原因吧。

2. 第一轮技术面试过程问答精选

旁白:面试我的哥们儿比较腼腆,也许是他也刚进公司没多久的缘故,好像才4个月的样子。他主要问了我都做过哪些Android项目,怎么学习的Android,都做过哪些Android控件,然后他又问了一个他们公司目前正在做的项目遇到的一个难题,问我怎么解决。

PS:最后这个问题,阳哥感觉他并不是在考察我的技术,而是以请教我问题的态度在向我咨询了。面试能面到这种程度,基本已经有戏了。

面试官问:介绍下你都做过哪些Android项目?

我(阳哥)答:这自己主要做过3个项目,新闻类的,应用平台类的,手机管理类的,其中自己参与多也做的成熟的是新闻类的一款App。

旁白:上面的三种类型的项目,都是黑马Android课程体系中的教案,因此介绍项目基本没压力。

面试官问:那你在项目的开发中担任一个什么角色?

旁白:这样的问题其实很多面试官都问我了,感觉被问到的概率有80%,此种问题显然是想考察我们的担当能力,技术担当和责任担当。在上海黑马66期的开班典礼上,我是这样给大家说的,我们66期有70多位同学,我们班分成10个小组,每个小组选出一名组长,组长负责全组的学习,组长不是固定不变的,每周考试一次,每次考试成绩高者为组长。每次考试如果这个组的平均分在班排名低的,组长得无条件接受惩罚。在黑马,没有个人排名,只有团队排名,我们更注重团队的协同能力,而不注重个人的表现。

我(阳哥)答:我在这个项目中属于主要参与者之一吧,或者说是主要负责人,我们Android项目不像是javaweb项目那样需要大量的程序员,像我们的项目,总共2到3个程序员3个月功夫就能搞定,因此我们几个人也没有绝对的说谁领导谁。不过这样的项目,让我们任何一个人去开发都是很OK的,只是时间问题。

面试官问:你们用什么代码管理软件?

我(阳哥)答:SVN。

旁白:在黑马有专门的一节课是讲SVN和Git的,并且后面的项目也是用SVN跟大家进行代码共享的。

面试官问:你学习Android的途径都有哪些?

我(阳哥)答:现在是互联网时代了,不像我们大学时代主要通过书本学习。在大学的时候选修的Java课程,那时候还是诺基亚时代,图书馆的移动开发书架基本是被诺基亚的塞班占据的。自己大学毕业的时候Android已经开始风靡全国了,那时候自己从网络上看到的Android开发的各种视频,然后开始学习的Android。自己在Android的开发中遇到的各种问题一般都是靠百度解决的,说度娘是好老师真不为过,其实也用过Google,不过被屏蔽了,也懒得翻墙,百度现在做的也不差,百度出来的Android技术主要来自如下专业网站,比如:CSDN、51CTO、ITEye、AndroidBus、EOEAndroid等,对了还有一个国外的没有被屏蔽的网站是Github,我们项目中的很多控件其实都是从Github上学习过来的。

面试官问:那你从Github上都用到过什么控件?

我(阳哥)答:Github上的开源项目非常的多,基本上你想用的东西都有,比如xUtils、HelloCharts、Clander、SlideMenu、SeatTable、LDrawer、SmoothProgress、Touch Gallery、ViewPagerIndicator。

面试官问:你自己有做过自定义控件吗?

我(阳哥)答:自定义控件做过,比如我们项目中的SlideMenu,LazyViewPager,Pull2RefreshListView,VerticalSeekbar,RandomLayout等都是自定义控件。哦,对了,最近我刚给我女朋友还做了一个HideSlideBar控件,我可以让你看一看。里面主要由VerticalSeekBar+ProgressBar+NineOldAnimation完成的。

旁白:我把我自己做的自定义控件给他演示了一遍,这个是我女朋友项目中需要用的一个需求,她不会做,我帮她写了一个Demo,没想到正好用上了。

面试官问:哦,不错,你这个动画用的是属性动画吧?

我(阳哥)答:对的,这个属性动画,用了JakeWharton大神的开源框架。不过这个属性动画其实自己写也可以,内部原理比较简单,就是给控件设置一个开始位置,一个结束位置,设置一个延时时间,然后不停的更改控件的layout位置即可。

旁白:这个东西在黑马的项目中都有讲解,回答不难,在Android应用中我们会用到很多第三发的框架,我们不仅仅要会用别人的东西还必须知道别人写这个东西的内部原理。 面试官问:那好,现在我们有个项目遇到一个问题,你看如果让你做你应该怎么去解决? 旁白:这时候,阳哥已经感觉到自己已经PK成功了。不过面试官性格也不错,遇到问题善于寻求外界的任何帮助。

我(阳哥)答:可以的,什么需求您讲吧,我听听。

面试官问:我们的项目中有多个Fragment,Fragment A跳转到Fragment B,Fragment B跳转到FragmentC,那么这时候我多次按返回键,如何能让Fragment跟Activity的任务栈一样,依次从FragmentC跳转到FragmentB,再跳转到FragmentA?

旁白:这个确实是需要比较棘手的问题。其实面试官也知道你没有做过类似需求的开发,事实也是这样。这就比较考验临场发挥能力了。这种问题可以从模仿Activity任务栈考虑解决。任务栈是一种数据结构,我们可以自定义这种数据结构,然后管理这个数据结构,但是每个Fragment都是独立的,如何把这些独立的Fragment关联起来,这都是需要考虑的问题。

我(阳哥)答:这个需求应该很好实现。我们可以这样,首先定义一个BaseFragment,让FragmentA、FragmentB、FragmentC都继承BaseFragment,第二在BaseFragment中定义一个ArrayList,每打开一个Fragment,把这个Fragment对象添加到ArrayList中,这样这个ArrayList就可以当做一个栈结构,第三我们需要设置返回键监听,当监听到返回键的时候,查看当前ArrayList中倒数第二个Fragment有没有Fragment,如果有则取出该Fragment并把ArrayList中末尾Fragment删除,然后用FragmentManager的Replace方法,将当前Fragment替换成最新Fragment即可,如果ArrayList中只有一个Fragment,且监听到了返回键,那就不对Fragment做处理,同时也不拦截该事件,这样也不会影响其他Activity之间的切换。 旁白:回答了上面的问题后,面试官说他回去试试,然后就去叫他们的领导了。

3. 第二轮技术复试过程问答精选:

旁白:第二轮面试我的是个技术大拿,主要负责公司整个软件架构的设计,这家公司之前只有web端,全都是他干的,现在公司向移动端发展,因此最近一直在招Android和iOS开发人员,他不太懂Android,不然估计他一个人就能把一个Android项目搞定了。他问了我一些关于http、数据安全的知识,然后就开始跟我谈人生了,一直到他们快下班,他才把人事叫来跟我谈了谈薪资。

经理问:你做的Android的项目跟服务器交互都有哪些接口?

旁白:大家不要被接口这个词给迷惑了。这里的接口不是java中的接口类,也不是很高大上的东西,其实换成大白话就是你们的客户端跟服务端是如何实现数据的交互的。

我(阳哥)答:我们的接口有多种形式,第一种是http的形式,客户端跟服务器通过http协议传输数据,比如我们的新闻列表的请求都是给服务器发送的get请求,然后服务器把数据发给我们,我们上传给服务的图片是通过http的post请求方式完成的。第二种是socket完成的,服务端开启ServerSocket,客户端开启socket,然后客户端跟服务端建立长连接,这样实现了客户端跟服务端数据的即时通信,通信的协议是我们公司按照xmpp开放协议的基础上修改的,其实xmpp协议就是一个xml格式的数据。第三种是集成了第三方接口,比如分享功能用的是ShareSDK,消息推送用的是JPush,内置广告用的是万普世纪。

经理问:你们http传输数据的时候安全是怎么保证的?

我(阳哥)答:我们的数据有些是需要安全设置的有些不需要,我们的新闻类数据不需要特殊的添加安全设置,而用户注册,用户登录以及用户隐私数据保存是考虑安全性的。用户的密码等信息肯定不能进行明文传输的,我们将用户的密码在本地进行了MD5算法的加密,然后再传输。同时保存在本地的时候也是加密后的数据。还有需要安全性更高的数据需要通过我们自定义协议通过Socket传输。

经理问:那你知道MD5的原理吗?

旁白:老程序员就是喜欢刨根问底,如果技术功底不雄厚的话确实这个问题很难应付,因为对于大多数人只需要用一个技术就行了,不会去关注他的内部原理。

我(阳哥)答:MD5算以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了复杂处理后,输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。这个过程是不可逆的,我们也把他叫做数据指纹,但是我们依然对用户的输入进行安全校验,如果是纯数字类型密码,是不允许注册的,因此就算你MD5加密了,黑客也可以通过彩虹碰撞的形式进行暴力破解。

旁白:接下来,经理问了我几个问题可能能难住我,关键是他也不懂Android,只能问我javaSE和思想上的一些东西,之后就开始跟我聊人生了,说他们公司是国企背景,自己在公司发展多么好,公司未来要做一个什么什么样的产品,公司弹性工作制,每年至少14薪,又问我女朋友在哪,什么时候考虑结婚,在哪买房,老家是哪的,爸妈是干什么工作的,你是如何规划未来的等等。。。。。

4. 人事面试:

这家的人事面试与其说是人事面试还不如说成人事咨询,人事跟我介绍了公司背景,跟我谈了薪资,跟我谈了入职安排,又谈公司发展,公司的福利待遇等等。人事的最后一个问题都是出奇的相似,

人事:我该问你的问题都问完了,你还有什么要问我的吗?

PS:这些问题千万不要一个都不问,这样人事会认为你这个应聘者对我们公司不感兴趣。如果有其他人也去面试,那么你就可以能被PASS了。其实我们真的想去这家公司的话,肯定会有一大堆问题的,但是也不要问的太多,问的太多显得你很啰嗦,人事的耐心也是有限的,同时也不要问太低级的问题。对于我们程序员来说,应该最关注如下两大类问题,一是自己将要加入的开发团队的情况,二是公司的薪资待遇以及员工培训发展情况。第一类问题显得我们技术专业,技术屌丝的特性被发挥的淋淋尽致,第二类问题很现实,我们不仅要眼前的工资还要考虑未来的发展。

我(阳哥)答:咱们公司的技术团队目前有多少人,都做哪些项目?

人事:公司目前技术团队还在不停的扩建,目前总共有十几名,不过服务端人比较多。现在主要做p2p理财类产品,这也是很火的一个趋势。

我(阳哥)答:咱们公司给开发人员有定期的培训吗?

人事:有的,公司每年都有拓展培训,拓展培训是针对全体员工的,技术团队的话每周或者每个月可能有技术分享活动,每周一名技术人员进行分享,同时可以获100元/次的奖励。

面试吐槽:

阳哥在上海第一天竟然面试了3家,上海这么大,每个公司都在不同的区,回到家已经晚上7点多了,我的感受只有一个字儿累,躺在床上就起不来了,不过还好今天本来是抱着被面试官“虐”的心态去的,结果没有被“虐”,而且还能旗开得胜。这给了我很多自信,不仅仅是对自己技术的自信,更是对黑马Android课程的自信。

最后送大家一句话:没有企业给不了的薪资,只有自己掌握不了的技术。没有自己掌握不了的技术,只有不够努力的自己。

录用Offer!

4. 挑战公司No.4:上海游竞网络科技有限公司—-PLU

公司地址:上海市闸北区广中西路777弄99号江裕大厦10层

面试时间:5月13日 14:00 PM. 面试结果:Android工程师,16K offer+500元住房补贴+490元交通和饭补+200元全勤奖=17.1k:victory: 面试过程:

16:00到公司,这家公司在闸北区,比较远,不过办公楼很高大上。 16:00~16:30 填写面试登记表和笔试题。 16:30~17:15 跟面试官进行技术PK(这家面试流程比较简洁,技术只考察一轮就让人事谈薪资了)。 17:20~17:40 跟人事谈人生谈薪资。

疯狂的笔试+面试记录(前方内容“高能”:funk:,请准备高度精神集中前行):

  1. 笔试

PS:笔试是在公司前台旁白的桌子上做的。阳哥本来胆子就小,这一下搞的偷拍都没自信了,导致对焦不成功,拍出来的照片很模糊,大家凑合着看吧,我把图片上的试题以文本的形式列出来,如下。

Q:Activity的生命周期? PS:我晕,跟复深蓝的笔试题如此的雷同,难道他们两家公司技术人员互相抄袭的吗?忍住,不笑! A:onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart。

Q:Activity销毁前,如何保存Activity的状态? A:可以使用onSaveInstanceState(Bundle)方法将Activity中需要的数据保存起来,当下次重新启动Activity的时候在onCreate(Bundle)中获取Bundle数据。

Q:请介绍下Android中常用的5种布局? A:LinearLayout、RelativeLayout、FrameLayout、RelativeLayout、TableLagout。

Q:请介绍下Android的数据存储方式? A:SharedPreference、XML、SQLite、文件系统、内存(如果算的话)。

Q:AIDL的全称是什么?如何工作?能处理哪些类型的数据? A:

  • Android Interface Definition Language

  • AIDL一般用于远程服务,也就是进程间通信。我们可以分服务端和客户端,服务端声明AIDL文件,该文件命名为xxx.aidl,ADT会自动将xxx.aidl生成代码文件,代码文件提供了aidl中接口的实现。客户端如果要使用服务端提供的服务需要将xxx.aidl文件放到客户端源代码目录下,然后生成xxx.java类,客户端通过bindService的形参ServiceConnection的onServiceConnected获取到Service对象,这个对象通过Stub.asInterface(service)返回aidl的实现类。之后我们就可用调用这个aidl的实现类。

  • 基本数据类型都可以,复杂对象也可以,只不过需要实现Parcelable接口。

Q:请介绍一下handler机制? A:Android中handler多用于主线程和子线程之间的通信,比如在Android中子线程是不允许修改UI的,如果修改只能让子线程给主线程通过handler发送message,然后主线程进行修改。Handler整个机制的实现,还依赖Looper、Message两个核心内容。在主线程中Android默认给我们创建了Looper

Q:java如何调用c、c++语言? A:java通过JNI调用C/C++代码,在使用的时候首先通过System.loadLibrary(“xxx”)将xxx.so文件加载到jvm中,同时在类中必须对so文件中的方法进行生命,格式:public native void test();

Q:Android分几层,分别是什么? A:四层。Linux Core、Libraries(Android Runtime)、Application Framework、Applications。

Q:final、finally、finalize的区别? A:第一个是关键字最终,用final修饰的类为最终类,不能被继承,修饰的方法不能被覆写,修饰的变量不能被改变。finally是异常体系中的关键字,当系统遇到异常是,在进行trycatch的时候,finally代码块里的代码是必须被执行的。finalize是Object类中的方法,当GC回收对象时回调的方法。

Q:heap和stack的区别? A:堆和栈。栈存放对象的引用,堆存放对象实体。堆中的对象是有jvm的垃圾回收器负责回收。

2. 第一轮技术面试过程问答精选:

旁白:面试我的是85年出生的Android组组长(这是后来他们公司人事给我打电话让我入职的时候,跟我说的)。他们公司是做游戏视频直播平台的,因此对app的性能要求比较高,他用手机让我看了一段代码。代码(记得不是很清楚了)大概如下:

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. new Thread(new Runnable() {
  7. @Override
  8. public void run() {
  9. while (true) {
  10. SystemClock.sleep(1000);
  11. }
  12. }
  13. }).start();
  14. }
  15. }

面试官问:上面的代码有问题吗?

我(阳哥)答:当然有问题呀,这个Activity在启动的时候开启了一个子线程,但是当Activity退出的时候该子线程还在运行,并没有停止。子线程运行在进程中的,Activity退出的时候进程并没有退出,而由前台进程变为后台进程。

面试官问:那应该怎么解决?

我(阳哥)答:我们可以这样,把while(true)改成while(flag),flag是一个boolean类型的变量,通过改变flag的true或者false来终止子线程的运行,当Activity退出时会调用onDestroy方法,因此在该方法中我们可以把flag设置为false。

旁白:面试官听了我的答案,从他的表情上来看好像他不是很满意。但是他也没说我说的对不对,而是给我说了他心中的答案,不过他给的答案我当时是虚心接受了,不过到现在我还没明白他说的道理在哪,我写了测试代码也没测试出来啥。

面试官问:这个代码有问题就出在这个Thread是一个匿名的,而且没有声明为静态成员变量?

我(阳哥)答:哦,这样子呀,这个我真不知道。

旁白:其实我内心是很想问他为什么呢?但是如果他答不上来就会让他很难堪,如果回答上来了倒没啥问题。从他也不自信的言语中我感觉还是不问他比较好?

面试官问:你对RTSP流媒体协议有了解吗?有没有做过手机播放器的应用?

我(阳哥)答:这个知道,自己做过流媒体播放器。我使用过开源的Vitamio开源库。 旁白:黑马课程中有一个项目是手机影音。因此这个东西自己是知道的。不懂的人可能以为RSTP、ffmpeg这些专业名词都多么的高大上,其实在黑马手机影音中,我们会做一个视频播放器,视频播放器分两种,一种是Android自带解码,第二种是万能播放器,所谓万能播放器就是绝大多数流媒体格式都支持。

面试官问:那你知道代码测试怎么测?

旁白:关于测试,阳哥真心不太懂,怎么办??尽量回答一些自己知道的,同时把测试方面的话题给关闭掉,省得面试官追问我。

我(阳哥)答:您说的是Monkey Test吗?。

面试官问:恩。。。也算吧?还有其他吗?

我(阳哥)答:我们程序员在写代码的时候都是有规范的,优良的代码规范是规避bug重要的一步,同时我们公司每周都有一个代码走读会议,所谓的代码走读,就是开发人员互相看对方的代码,检查代码是否规范以及是否存在bug。当然也有测试,不过我们的测试都是黑盒测试。

面试官问:哦,代码测试,就是可以通过测试一段代码来分析这段代码有没有问题,性能是否可靠。

我(阳哥)答:对的,Android自带了AndroidTest功能,可以对一个类一个方法进行测试。 面试官问:那好,图片你有处理过吧?

我(阳哥)答:这个肯定有呀,哪个Android应用没有图片。比如图片缓存呀,图片缩放呀,图片缓存呀。

旁白:其实自己对图片处理这块儿,还是比较了解的,可惜他也没怎么深问我,没有给我很大的发挥机会。

面试官问:我们现在要做一个视频在线播放的app,播放的都是游戏直播或者录像视频,iOS已经做好了的,Android还没有做好,你要是进来的话你就是做视频直播这一块儿。 我(阳哥)答:这个已经做好的能让我看一下吗?

旁白:面试官拿来水果机让我看了一下,主界面就是一个ListView,每个ListView的一行都有大概4个视频预览图,点击之后可以播放。

我(阳哥)问:这个切图,设计啥的都做好了吧,剩下的就是编码了其实? 面试官答:是的,后期我们Android团队还会不停的夸大,我们的发展重心已经偏向移动端。 旁白:接下来就是跟面试官侃大山了,从天文到地理,从BAT到初创型公司,阳哥也不能甘拜下风。

我(阳哥)答:恩,现在是移动互联网时代了,移动端肯定得做好,不管什么样的公司都特别重视移动端。咱们公司现在才开始研发移动端,其实已经稍微有点儿晚了,就得赶紧拼命追赶了。

3. 人事面试:

跟面试官聊完后,技术官对我的评价是,我挺喜欢你,你跟人事好好聊聊吧,哈哈,我肯定会跟人事MM好好聊天的。人事问的问题太老套路了,感觉全上海人事问的问题都一样,难道他们都是从一个地方培训出来的?人事也有培训吗?其实应付人事的问题不难,难的是如何回答人事的问题。答题的方式直接决定了我们在人事那里的印象。我把人事问的几个问题大概列一下。

人事:你为什么离职来上海?

PS:人事问这个问题的主要目的就是看你的动机纯不纯,有没有不良倾向。

我(阳哥)答:主要是两个方面吧,第一个是我的女朋友在这边工作,我年龄也不小了,也到了谈婚论嫁的时候了,我不着急,家里父母亲着急呀,来上海工作的话离女朋友比较近,结婚就比较好办,第二个主要还是。。怎么说呢。。。高大上的说就是为了自己事业更高的发展吧,说的直接点就是上海毕竟国际化都市,发展机会很多,自己也想来上海工作个3~5年挣钱买个房子首付啥的,如果在上海的这几年发展的好可以考虑再公司附近买房,如果自己发展的不好,在上海周边买个房也行。

人事:你女朋友一直在上海,还是刚回来上海?。

我(阳哥)答:她上一年来的这边,之前是我大学同学,主要是她家有亲戚帮她找了一份设计院的工作,而我只能靠自己找工作。

人事:你以后打算长期留在上海了吗?

旁白:上面的问题其实是人事在考察你的稳定性,公司可不想招到一个人刚培养出来就走掉了。但是如果你直接肯定的回答:我会一直留在上海,又显得很假。“装”的高境界就是让对方感觉你很不会“装”。

我(阳哥)答:这个有想过,自己其实蛮喜欢上海的,可是计划赶不上变化,来上海的前一年我也从来没想到我会来,因此不能说一辈子都在上海,不过目前这几年是打算在上海好好发展一下。上海的房价、户口政策都是问题,现在不是我选不选择上海,而是上海选择不选择我的问题,呵呵,其实谁都不傻,都想来好地方,关键就看自己有没有本事扎根于此了。

人事:你能承受加班吗?

旁白:其实互联网企业加班是很常见的现象,尤其是像上海这种生活节奏比较快的城市,加班肯定是避免不了的,但是我们也有我们的底线,不能无条件无休止的为公司加班,但是也不能一点儿班都不能加,毕竟有时候公司忙的话,比如新产品上线,新bug的解决都是需要加班的,这个时候我们还真的义不容辞的为公司付出,毕竟我们的薪水是公司给的。在公司工作一方面是我们为公司付出,另一方面我也要知道感恩公司。

我(阳哥)答:加班很正常,自己之前的公司也经常加班。不过公司加班一般都不会让员工平白无辜的加班的,我们加班的时候公司会发晚餐补助,打车补助等,如果加班超过半天会计入到我们的存休中,等活不忙的时候我们可以申请休息。因此只要不是高频度的天天加班到凌晨应该没啥问题的。

人事:你的五年规划是啥?

我(阳哥)答:自己还是想往技术方向发展,自己也比较喜欢代码,愿意去研究技术。人往高处走水往低处流,经过自己几年的积累后自己想当一名技术总监或者项目经理类的技术管理类岗位。不过这些都得靠自己的努力以及对机遇的把握情况了。

面试吐槽:

这家企业各个方面的条件真心不错,想拒绝都很难找到合适的理由!我要了15k的薪资,人家给了16k,还有各种诱人的福利。感觉还是游戏类的公司土豪。你以为你要15k,人家给你16k已经很高了吗?请让我把话说完,告诉你啥叫游戏公司。该入职的时候,当然我没有去入职(入职是上午10:00),上午10:20的公司人事给我打电话,问我迟到了还是怎么会儿事儿,我说对不起,感谢贵公司对我的认可,自己已经有了新的选择。把他们给拒绝了。下午1点多的时候,我正在吃饭,结果这家公司的技术官又给我打电话来了,在电话里跟我聊了很久,他说如果再给你多几k你会考虑过来上班呢?我哑巴了,自己从来就没有享受过这么好的待遇,受宠若惊的阳哥无言以对!自己的内心像打翻了五味瓶一样,这种感觉估计也没有几个人理解。后来还是被我给拒绝了,内心在流泪!

这篇文章阳哥已经写到尾声了,但是想给大家说的话却依然很多很多。

亲爱的黑马同学们:如果你还在撸着代码,看着视频,再苦再难,请你一定要坚持,今天你付出的一点一滴都将会在明天变成千千万万倍的回报。加油&坚持!

5. 挑战公司No.5:一号店旗下壹药网

公司地址:上海市浦东新区碧波路572弄115号10幢

(偷拍前台妹子~天热,穿的少其实是正常的,可惜桌子挡住了该看的,哦,不该看的:lol)

面试时间:5月14日 10:00 AM. 面试结果:Android工程师,15K offer&14个月薪资:victory: 面试过程: 10:10到公司,这就是传说中的一号店!,公司总共三栋独栋楼,两个在装修,一个在用,因此工位紧张,导致我面试都是在前台所在的大厅里进行的。 10:20~10:50 填写面试登记表和技术官面试。 10:50~11:10 跟研发部Leader面试。 11:10~11:30 跟人事谈薪资以及入职事宜。

疯狂的笔试+面试记录(前方内容“高能”:funk:,请准备高度精神集中前行): PS:笔试跟面试是一起的,一个技术官拿着一张正反面都写满题的A4纸,从第一题到最后一题,他指一题我回答一题,我回答一题,他指下一题。配合的天意无缝,哈哈~~~

1. 笔试

java基础部分

Q:Java面向对象有哪些特征? A:封装、继承、多态。

Q:short s1=1;s1=s1+1有什么错?short s1=1;s1+=1;有什么错?

A:第一个是有错的,short在内存中占2个字节,而整数1默认为int型占4个字节,s1+1其实这个时候就向上转型为int类型了,因此第一行代码必须强转才行。第二个之所以可以是以为这句话翻译过来就是s1++,也就是short类型的数据自身加增1,因此不会有问题。

Q:静态成员类、非静态成员类有什么区别?什么是匿名内部类? A:静态成员类相当于外部类的静态成员,是外部类在加载的时候进行初始化,非静态成员类相当于外部类的普通成员,当外部类创建对象的时候才会初始化。匿名内部一般都是在方法里面直接通过new ClassName(){};形式的类。比如我们new Thread(new Runnable(){}).start();就用到了匿名内部类。

Q:abstract class 和 interface有什么区别? A:前者是抽象类,可以有抽象方法,也可以没有。后者是接口,只能有抽象方法。他们都不能创建对象,需要被继承。

Q:ArrayList是不是线程安全的?如果不是,如何是ArrayList成为线程安全的? A:不安全的。可以使用Collections.synchronizedList(list)将list变为线程安全的。

Q:是否可以继承String类? A:不可以,因为String类是final类。为啥不解释了吧。

Q:以下两条语句返回值为true的有: A:"yiyaowang"=="yiyaowang"; B: "yiyaowang".equals(new String("yiyaowang")); A:第一个返回true,都是字符串常量,存储在字符串常量池中,且只有一份。第二个返回true,用equals比较的是字符串内容。

Q:当一个对象被当做参数传递到一个方法后,此方法可以改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? A:java中只有值传递,没有引用传递。这里的引用本身就是值,传递的是引用这个值。

Q:定义类A和类B如下:

​```java class A{ int a =1; double d = 2.0; void show(){ System.out.println(“Class A:a=”+a+”\td=”+d); } } class B extends A{ float a = 3.0f; String d = “Hello World!”; void show(){ super.show(); System.out.println(“Class B:a=”+a+”\td=”+d); } }

  1. (1)若在应用程序的main方法中有以下语句:
  2. ```java
  3. A a = new A();
  4. a.show();

则输出结果是?

(2)若在应用程序的main方法中定义类B的对象b:

  1. A b = new B();
  2. b.show();

则输出结果是?

A:第一个是ClassA :a=1 d=2.0 第二个是ClassA :a =1 d=2.0
ClassB : a=3.0 d=Hello World!

Q:heap和stack有什么区别? A:堆和栈。栈存放对象的引用,堆存放对象实体。堆中的对象是有jvm的垃圾回收器负责回收。

Q:请描述下JVM加载class文件的原理机制。 A:JVM加载class是动态性的,也就是当“需要”的时候才会加载,这是也是为节约JVM内存来考虑的。同时JVM的类加载是父类委托机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”。

Android基础部分

Q:如何适配不同屏幕分辨率的机型? A:屏幕适配方式就多了去了。Android系统本身提供了很多适配方法,比如存放图片资源的drawable目录根据不同分辨率的手机提供了drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi等多中目录。我们只需把适应不同分辨率的多套图片分别放到对应的目录中即可。Android的layout、values目录也提供了类似drawable的适配功能。但是在开发中,不可能针对不同的手机分辨率提供多种图片资源,这太耗费资源了。我们一般在写控件宽高的时候都会用dp单位取代pix单位。因为dp是一个相对单位,pix是绝对单位,使用dp替代pix也可以解决很多适配问题。dp跟pix之间可以通过公式进行转换。

Q:View和ViewGroup的关系是什么?View的绘制过程(主要方法)有哪些? A:ViewGroup继承了View。onMesure、onLayout、onDraw。

Q:Activity和Task的区别及启动模式有哪些? A:Activity运行Task中。Activity有四种启动模式。standard、singleTop、singleTask、singleInstance。standard:默认的启动模式,多个Activity位于同一Task中。singleTop,顾名知义就是Task栈顶只能有一个相同的Activity,singleTask就是一个Task中只有一个Activity,singleInstance就是一个Activity独享一个Task。 PS:关于Activity的四种启动模式其实还有更详细的说法,我在上面就简单介绍一下了,如果面试官需要问的更详细再往深处介绍就行了。

Q:如何注册BroadCastReceiver和Service?Service有什么特征,哪些情况会用到Service? A:都可以通过AndroidManifest.xml进行静态注册。不过BroadCastReceiver可以在代码中通过registReceiver方法来注册。Service运行在后天进程中,一般需要在后台一直运行的任务会让Service来完成。比如我们的telephoneService、locationService等等。

Q:Android有哪些安全机制? A:权限机制。我们的应用只要涉及到了用户的隐私、网络都需要在AndroidManifest.xml中进行声明,这样用户在安装的时候可以根据你申请的权限进行判断是否允许应用的某些行为。

Q:Handler机制的原理,内部是如何实现的? A:Android中handler多用于主线程和子线程之间的通信,比如在Android中子线程是不允许修改UI的,如果修改只能让子线程给主线程通过handler发送message,然后主线程进行修改。Handler整个机制的实现,还依赖Looper、Message两个核心内容。在主线程中Android默认给我们创建了Looper,当我们通过handler.sendMessage()后,该消息被添加到MessageQueue中,Looper.looper中有个while(true)的循环不停的从消息队列中取消息。取消息的过程是线程阻塞的,这样不至于在没有消息的时候过多的耗费CPU资源。

Q:Thread和AsyncTask的区别是什么? A:AsyncTask是封装好的线程池,比起Thread+Handler的方式,AsyncTask在操作UI线程上更方便,因为onPreExecute()、onPostExecute()及更新UI方法onProgressUpdate()均运行在主线程中,这样就不用Handler发消息处理了;

Q:说说MVC模式的原理,在Android中的运用。 A:MVC是Model、View、Controller三部分组成的。其中View主要由xml布局文件,或者用代码编写动态布局来体现。Model是数据模型,其实类似javabean,不过这些JavaBean封装了对数据库、网络等的操作。Controller一般由Activity负责,它根据用户的输入,控制用户界面数据的显示及更新model对象的状态,它通过控制View和Model跟用户进行交互。

Q:如何加载ndk库?如何在jni中注册native函数,有几种注册方式? A:通过System.loadLibrary(“xxx”)进行加载。其实native有几种注册方式,自己当时并不知道,自己只知道一种注册方法,就是首先根据native 方法名,生成Java_com_xxx_MethodName(xxx,xxx);当然这个c/c++源码文件中需要引入jni.h,然后把这个c/c++源码编译成so文件。

自己后来百度了一下,网上有人数还有一种注册方式是动态注册,我就把关于动态注册的东西直接拷贝过来: JNI 允许你提供一个函数映射表,注册给Jave虚拟机,这样Jvm就可以用函数映射表来调用相应的函数,就可以不必通过函数名来查找需要调用的函数了。Java与JNI通过JNINativeMethod的结构来建立联系,它在jni.h中被定义,其结构内容如下:

  1. typedef struct {
  2. const char* name; //Java中函数的名字
  3. const char* signature; //用字符串描述的函数的参数和返回值
  4. void* fnPtr; //指向C函数的函数指针
  5. } JNINativeMethod;

第一个变量name是Java中函数的名字。 第二个变量signature,用字符串是描述了函数的参数和返回值 第三个变量fnPtr是函数指针,指向C函数。 当java通过System.loadLibrary加载完JNI动态库后,紧接着会查找一个JNI_OnLoad的函数,如果有,就调用它, 而动态注册的工作就是在这里完成的。

1)JNI_OnLoad()函数

JNI_OnLoad()函数在VM执行System.loadLibrary(xxx)函数时被调用,它有两个重要的作用: 指定JNI版本:告诉VM该组件使用那一个JNI版本(若未提供JNI_OnLoad()函数,VM会默认该使用最老的JNI 1.1版),如果要使用新版本的JNI, 例如JNI 1.4版,则必须由JNI_OnLoad()函数返回常量JNI_VERSION_1_4(该常量定义在jni.h中) 来告知VM。 初始化设定,当VM执行到System.loadLibrary()函数时,会立即先呼叫JNI_OnLoad()方法,因此在该方法中进行各种资源的初始化操作很恰当,

2)RegisterNatives

RegisterNatives在AndroidRunTime里定义 syntax: jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,jint nMethods) Q:App在什么情况下会出现内存泄露?如何避免这些情况? A:造成内存泄露的可能性有很多,我说几种吧,1)资源未及时释放,比如引用的io流资源、网络资源、数据库游标Cursor等没有释放2)注册的监听器、广播等未及时取消3)集合对象没有及时清理4)不良代码

避免上述问题,主要还看程序员知识掌握的程度和编码经验的多少,但是从技术角度考虑我们需要注意一些细节,比如,重复使用的资源可以考虑使用缓存技术、池技术。使用的任何资源都记得关闭或者异常处理,保证在恶劣的情况下也能使资源得到释放。对于图片的操作要注意缓存的使用,同时要记住对图片对象进行及时的回收。使用ListView的时候,尽量让ConvertView得到复用。

3)逻辑思考

Q:你让工人为你工作7天,给你工人的回报是一根金条,金条评分成7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,如何给你的工人付费? PS:因为上面的问题自己回答的都比较溜,所有这个逻辑思考题,面试官直接说我想着你也会就不做吧。哈哈~面试官已经放弃继续考察我了,嗨皮。然后他去找老大去了,趁机我赶紧把笔试题给偷拍了下来(是不是阳哥胆子越来越大呀?!),这样才能大家看到真实的笔试题是什么样子滴。

哦,对了,上面的逻辑思考题我面试的时候是免试的,亲爱的黑马童鞋们你们知道答案吗?

2. 第二轮面试过程问答精选:

旁白:面试我的应该是开发组部门的老大。胖胖的,黑黑的,矮矮的,从开始面试到结束,一直面带微笑。因为之前那个技术官已经面试过我的技术了,因此他也没问我技术,就是跟我瞎聊了一些关于Android方面的东西。因此详细内容这里就省略了,请大家直接进入下一关~duang~

3. 人事面试:

人事面试的问题,其实我在V4版本中也说过,基本所有的人事问的问题都大同小异,跟这个人事聊的唯一有趣的就是,由于公司正在装修,找不到面试我的办公地点,然后她竟然把我带到公司旁边的凉亭子下面,我们两个并排坐着,就聊起来了,知道的知道我们是在面试,不知道的估计还以为我们在谈恋爱呢

面试吐槽:

在前台我填写面试登记表的时候写的期望薪资是15k,他们也没有压低我工资,我知道我要少了。不过,没办法,谁让阳哥不懂行情,在投递简历的时候都是写着期望15k呢!想写个16、17、18都不好意思了,因此大家以后找工作可别学阳哥这么傻,能多要一定多要。

跟大家分享一个励志语句以结束本篇文章吧:相信梦想是价值的源泉,相信眼光决定未来的一切,相信成功的信念比成功本身更重要,相信人生有挫折没有失败,相信生命的质量来自决不妥协的信念。

录用Offer!

笔试题(在前台眼皮底下偷拍~)

6. 挑战公司No.6:聚信租赁

公司地址:上海市徐汇区漕溪北路398号汇智大厦28楼

面试时间:5月14日 14:00 PM. 面试结果:Android工程师,16K +入职送iPhone 6+每年出国旅游一次+补充住房公积金+至少14薪:victory: 面试过程: 14:00到公司前台,领了一大堆资料,然后让我在一间办公室做题。 14:00~14:30 填写面试登记表和性格测试。 14:30~15:20 两个技术官坐在我对面,同时面试我。 15:20~15:30 人事妹子跟我单聊公司薪资福利以及入职事宜。

疯狂的笔试+面试记录(前方内容“高能”:funk:,请准备高度精神集中前行):

1. 笔试

这家比较奇怪,是给了6页的笔试题,打开一看全是性格测试题。性格测试题只拍了一张图片,在该篇文章的结果。估计大多数童鞋都想遇到阳哥这样的狗屎运吧;P~阳哥的性格绝对没问题的,这个我可以保证哈~:P

2. 技术面试

竟然同时来了两个技术官面我,一大一小,一高一矮,并排坐在一起,一对二,好吧,阳哥还是首次遇到1:2的阵容,这下可有好戏看了。PS:阳哥是个没有见过世面的人,面试的时候上个31层高的楼都兴奋的不得了,上去以后,发现上错楼了~糗事说多了都是泪:#,要不是阳哥有着过五关斩六将身经百战的成功经验,估计要吓尿:loveliness:。好吧开始吧,阳哥命中注定必有次劫,看来是躲不过了。

Q:你做一个自我介绍吧? 旁白:其实遇到好几家面试官都让我做自我介绍了,该如何自我介绍阳哥估计都会背了,好玩(恶心)的是在万达信息面试,面试了3个技术官,每个人都分别让我做了自我介绍,尼玛,他们3个就不会沟通一下要问我啥吗,一个问题至于问我3遍吗~:funk:阳哥是敢怒不敢言,毕竟在人家的地盘。

PS:自我介绍的内容就不说了,每个人都是独特的,我就跟大家说一下应该如何自我介绍吧。

一个优良的自我介绍会给面试官留下深刻的印象,大部分情况下,所谓的面试好坏其实看的就是你给面试官留下的印象怎么样了,我们用俗语叫感觉。

自我介绍应该分以下几个部分,按照一定的逻辑连贯起来。如果连贯不起来,或者不够熟练一定在台下多背几遍,多讲几遍,但是面试的时候不要说的跟背过似的,高境界就是让面试官感觉你是临场发挥的,却又比背的都好。

  • 个人基本信息(姓名、年龄、老家、居住地等)

  • 自己来自哪里(工作地点),是干什么的(给自己一个清晰的定位,比如:我是一名Android开发工程师),担任过什么职务、做过什么样的项目

  • 自己为何来贵公司面试

  • 最后祝愿(希望能得到贵公司的认可等等,不用太多,一两句话就ok)

Q:介绍一下你做过的项目吧? PS:黑马那么多项目,随便准备3个就ok了。 介绍项目大概的思路如下: 1)这个项目是干什么的(比如是一个类似网易新闻的地方新闻客户端,或者类似美团的o2o,或者类似豌豆荚的一个应用市场,或者类似淘宝的购物平台)?解释就是拿一个市场上耳熟能详的应用跟自己的应用做类比,省的面试官听的云里雾里的。 2)自己负责了哪些模块(功能)的职责(比如负责系统的架构,核心代码的编写,xx功能模块的开发等等) 3)自己在这个项目中担当的责任(比如,这个项目是自己独立开发的,这个项目是和另外一个同事一起架构一起开发的,这个项目是自己负责了几个核心模块) 4)项目中都用到了哪些技术 5)从项目中学到了哪些东西(可以从技术方向和业务两个方向入手)

旁白:面试官问的很多技术性问题跟之前问的都大同小异,因此这里只给出有特色且技术含量高的。阳哥正在写面试宝典,该宝典核心内容针对的还是技术问题,阳哥会从javase基础到javase高级,从Android基础到Android高级以及到Android项目依次展开分析,其次也会写一些常见的非技术性问题,敬请期待~

Q:①在Listview的优化中,我们为何使用ConvertView?②为何使用ViewHolder?③你认为哪个更能解决问题?④你认为view.inflate和view.findviewById哪个更耗时,为什么?⑤如果这两个AP让你重新写,你怎么写?

PS:上面的问题,阳哥认为是面试以来遇到很难的一个,也是很有技术含量的一道题。前一半问题还好回答,最后一个问题真的需要发挥想象了。

A:①使用ConvertView可以实现对view的复用,这样大大节约了每次创建对象的时间,提升了ListView的显示效率。②使用ViewHolder作为内部类,可以将view的子控件封装在ViewHolder类中,然后通过View.setTag(ViewHolder)将view和ViewHolder进行绑定,这样我们就不用每次都调用view的findViewById(id)方法来查找控件。③使用ConvertView解决了一大部分问题,使用ViewHolder实现了控件换时间的问题,因为给View对象设置一个Tag本身就是占用内存的,因此ViewHolder的使用还是需要区分不同的应用场景的, 没有绝对的好与不好。如果内存足够需要高效则ViewHolder建议使用,否则不建议使用。④当然是view.inflate耗时,这个函数完成的功能是把xml布局文件通过pullParser的形式给解析到内存中,需要io,需要递归子节点。⑤我其实还不太相信我写出来的代码比Google官方写的好,如果让我写的话我可能会这样考虑,当用户在使用view.inflate的时候将多个id作为数组添加到形参中,这样在初始化view的使用我就可以给这个view直接调用setTag方法绑定需要的子控件。不过这个原生方法其实也应该保留共不同的需求使用。

PS:技术面试时间并不长,我回答了几个之后,他们两个大眼瞪小眼,A看看B问:你还有什么问的吗?B说我没有,你还有吗?A说我也没了。那行,接下来,他们就让我等人事了。

3. 人事面试:

人事问的问题都差不多,我在上一篇也说过,这里就不说人事的问题了。唯一要给大家爆料的就是人事给我讲的他们公司的福利待遇,可以用土豪不差钱形容:)

人事说:入职后转正即送iPhone 6一部。

我(阳哥)说:我是做Android开发的,给我iPhone 6干嘛

旁白:你认为阳哥真不想要iPhone 6吗?为了显示咱的高度敬业精神,毕竟咱是做Android开发的,更需要的是Android手机,决不能像iPhone低腰(ni dao shi gei wo ya)! 人事说:我们Android开发人员也会额外配Android机的,iPhone6可以生活用。

旁白:我去~这就是没见过世面的阳哥,当时的表情。

人事说:转正满一年,每年都有一次出国旅游。

我(阳哥)说:哦,咱们公司还挺不错的嘛!

旁白:不知说啥好了,只能用表情来形容了,阳哥至今没出过国,国外啥个样子嘛, 人事说:我们一般一年更少发14薪,都是介于14~16薪之间,具体发多少要看个人平时的一个KPI考核了。

我(阳哥)说:哦,这样呀,还行吧。

面试吐槽:

在家公司的人事跟我算了基本工资16k+各种补助1k=17k+。每年出国旅游,入职送iPhone,补充住房公积金,好吧,阳哥受宠若惊了。自己回来会百度了一下,终于搞明白这家公司为何这么奢侈!不多说,看图吧。

跟人事面试的时候,人事说他们在上海总部目前有大概100多名员工,阳哥不懂经济,不知道100多人的公司能融资13个亿是个什么样的概念?这再次验证了阳哥的那句千古流传的话语,只要技术好,公司不差钱!