深圳--博雅互动 Android面试打酱油归来
公司在TCL工业园E4,坐地到西丽站,那边在修路,不好走。B796公交站台在A出口的反方向,还要顺着施工的屏障打个弯,在西丽法院1上车。公司那边比较偏了,附近只有两趟公交。办公地点在10楼,出电梯就可以看到前台,进去后左边走过去,有个条形大堂,大堂前有套会客的茶几,茶几上很多零食和矿泉水,大堂中放了很多带桌椅,供应聘者笔试用。大堂再往里走有个圆形的演示厅,厅里一直在放类似“开心一刻”的搞笑DV,一定程度上缓解了面试的紧张气氛。公司可以报销来的车费,有免费矿泉水和零食,说明其还是挺注重人文关怀的。
最近心态很差,主要是经济压力很大,加上一首《时间都去哪儿了》让我对生命充满了恐慌。想换个环境,又没啥心情好好准备。这次去博雅互动纯粹打酱油,既没去复习java相关的关键点,也没去了解Android的基础知识。本来也没投这家公司,这公司也没通知我去面试。是一X为的同项目组兄弟S收到面试通知,于是乎霸面来了。S对javascript、css兴趣高昂,自号前端工程师,于是去面的就是Web前端。而我这三年一直在做java开发,对前端虽然也一直有接触,写了很多页面代码,但没系统学习,平时也基本是拿来主义,所以要让我答前端的题目,肯定是一句代码都憋不出来的。看来看去,就Android与java近点。拿了套题和S一起来到大厅,找了个临近的位置坐下,开始答题。初略看了下,第一页是java基础知识,第二页是Android基础知识。因为本来就是打酱油的心态,所以看到一页天书般的安卓题,也泰然处之。先回忆下Java的题目:
1.Integer与int区别
这题基本做对。
int是基本数据类型,Integer是对int的一个封装类,包含一些对int的操作方法,如类型转换的ValueOf.因为java中基本类型是不能直接类型转换,所以要借助封装类来处理。
这里延伸一下我有用到过的一个类:Atomicinteger,是同步类,线程安全的。
2.Vector与ArrayList,HashTable与HashMap的区别。
这题应该是java各大面试宝典中的基础题,但我好久没看了,平时也很少用Vector(真的很少用到,可能是因为多线程的代码写少了),所以只答对了后面一对的区别,前面的一对基本属于瞎扯。但仔细想想,多深入猜下,应该知道这考的是一个线程安全与非线程安全的主要区别。
实际上Vector和ArrayList都继承于List接口,实现此接口的还有个LinkList.先不谈LinkList.。
ArrayList实际封装的是数组,是用一段连续的内存来进行存储,当数组空间不够时,将已有数组copy到新的空间中,因此其随机访问比较方便,插入和删除时相对比较耗时。因此这个类我们经常用到的方法是get(i):随机访问,以及add,尾部添加。
Vector是在ArrayList的基础上方法实现同步synchronized(很囧,当时不知道怎么拼写这个单词,写了个草书,哈哈).因此其在单线程中应用性能肯定要比ArrayList差。想想也易懂,每个方法都要排队等待来保持同步,是多么耗时。
说到这里,Collections.synchronizedList(List<T>)不得不提起。因为这个方法能将ArrayList中的方法通过信号量同步(同步代码块与同步方法实现上是有区别的)起来,实现线程同步。那加上这个方法后的list和Vector有什么区别呢?多线程时用谁好呢?
Vector会在存储空间不够时,一次性增加一倍的存储空间,增量大。ArrayList在存储空间不够时,一次性增加50%的存储空间,增量小。所以在存储量很大时,使用Vector效率要高些。还有一点需要注意的是synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码。因为迭代器涉及的代码没有在java api中没有加上线程同步代码。如果图省事,肯定是Vector,但是我们要注意到,若果多线程中都只是对集合进行遍历地取值的话,亦或各个线程中的List中的值有区别处理时,还是用synchronizedList好,毕竟这个方法是后设计出来的,目的就是让并发性能更好。详细分析见:http://www.cnblogs.com/yanghuahui/p/3365976.html
废话一堆,如果是临时抱佛脚的时候,没耐心看这么多。好吧,总结下:
区别是:1.线程同步与异步的区别;2.存储空间满后,一次性增量大小的区别
同理,HashTable与HashMap。我在项目中遇到过这么一个问题:多线程中用了个HashMap,因为我能保证Map的Key能完全不一样,所以我想不同步也罢。但是问题来了。在子线程执行完后进入主线程中时,发现有丢失key值的情况。后面仔细想想,这是个哈希Map,在多线程中对已有hash值的判断未同步,就会导致多个value与同一个key值对应,从而后面的value覆盖了前面的value。用Collections.synchronizedMap成功解决此问题。鉴此教训,多线程一定要考虑好线程安全,对于有同步和异步对应的类,一定要用同步类。
再细说下HashTable与HashMap的区别吧。除了以上List同理下来的区别。还有一个区别是,HashMap容许key为空值,HashTable不容许key为空值。因此HashMap判断某个值是否存在是用containKey
所以后一对的区别是:1.线程同步与异步的区别;2.HashMap容许key为空值,HashTable不容许key为空值
最后还要说到的是jdk1.5中引入了ConcurrentHashMap,注意没有对应的ConcurrentList.这个细节讨论很复杂。没耐心研究下去了,先贴链接如下:
http://www.iteye.com/topic/344876
3.TCP和UDP的区别。
这个我算是勉强答出来了。好久没用这么底层的东西了,记忆很模糊。
TCP (Transmission control protocol) 传输控制协议,基于连接的,所以一般与ip协议一起用,会有3次握手,才建立通讯。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。smtp协议和ftp都是基于此协议。
UDP(User data protocol)用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。流媒体一般都采用此协议。
4.线程的几种状态
我2了,写了休眠 运行 停止 和销毁
正确答案是 1.创建 2.就绪 3.运行 4.阻塞 5.销毁
5.sleep()和wait()的区别
这个基本答对了。
1.sleep()是Thread的方法,wait()是Object的方法。
2.锁资源的释放不同。sleep一般带参数,等待多少秒后自动运行。wait虽然可以带参数,但一般不带参使用。原因在于sleep()线程进入阻塞状态后,不会释放资源锁,只能等其自动醒来,如果需要强制此线程进行下去,需使用interrupt()强行打断。而sleep(0)代表线程再次去cpu抢占资源。wait是会释放掉资源的,因此自动醒来没资源也没用,所以其一般是需要在其他线程中调用notify或者notifyAll来唤醒。
3.使用范围不同,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 。
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
6.写一个单体实例
这个完全是顺手捏来,其一,实际编程service类一般都要用到,其二,最近有复读了一下 设计模式。这里的写法可能与有些对Gof理解的书中描述不一样。比如模式设计公司那位前辈出品的书中时将synchronized加到getInstance方法上的。这样即使单体类已经创建了,多个对象去取时,仍然要排队等待,从性能上来讲,差了点。
Class A{
private static A isntance; private static Object o = new Object();
private A(){}
public static getInstance()
{
//已经有了此单体实例,则不需要同步排队了
if (null == instance)
{
//无此单体实例时才进行排队判断,若未存在则创建
synchronized(o)
{
if (null == instance)
{
instance = new A();
}
}
}
return instance;
}
}
7.一个字符串中有中文、英文、数字。分别统计个数。
我很傻很天真的写下,用ASCII来区别统计……
实际也很简单,做惯了面试题的应该很容易写出来。从http://www.cnblogs.com/ShaYeBlog/p/3140754.html中拿来的
public class lianxi07
{
public static void main(String[] args)
{
int abcCount = 0;// 英文字母个数
int spaceCount = 0;// 空格键个数
int numCount = 0;// 数字个数
int otherCount = 0;// 其他字符个数
Scanner scan = new Scanner(System.in);// 扫描器接受控制台的输入信息
System.out.println("输入一组字符");
String str = scan.nextLine();// 取出控制台的一行信息,也就是你输入的信息
char[] ch = str.toCharArray();// 把取道的字符串变成一个char数组
for (int i = 0; i < ch.length; i++)
{
if (Character.isLetter(ch[i]))
{
// 判断是否字母
abcCount++;
} else if (Character.isDigit(ch[i]))
{
// 判断是否数字
numCount++;
} else if (Character.isSpaceChar(ch[i]))
{
// 判断是否空格键
spaceCount++;
} else
{
// 以上都不是则认为是其他字符
otherCount++;
}
}
System.out.println("字母个数:" + abcCount);
System.out.println("数字个数:" + numCount);
System.out.println("空格个数:" + spaceCount);
System.out.println("其他字符个数:" + otherCount);
}
}
Android的题记得:
Activity的生命周期;
Instent能传递那些类型的值;
Android的四大组件及其作用;
大图片资源在Android的加载中会遇到什么问题,怎么解决;
不同手机的分辨率不同,怎么去适配;
如何避免公司app不被360和腾讯手机管家杀掉。
应该还有一道题,记不起来了。基本都不会。最后一道题真想答成,要不让人家收购你,要不你收购人家。哎算了,考虑到张伟(创始人)拒绝了腾讯的投资,委婉写了下,运行app时建议关掉其他程序增强游戏体验。我看天天飞车就是有这么写。
笔试不尽人意,面试更可悲。笔试刚交卷不到3分钟,就有人叫我面试,可能面这个的人很少。开始是自我介绍,面试官走马观花看了下我简历和答题。然后就是问我有安卓开发经验不?我说没有。问我有对游戏研究不?我回答,玩得多,研究得少。真该回答研究得挺多的,具体可以和他谈谈dota。接着问我是不对游戏开发感兴趣,我说是。然后开始问我,现在对自己水平感觉怎么样?靠,咋回答,java基础还行吧。尼玛接下来就问基础的了。Objcet对象都有哪些方法,当时只记得clone。toString 、eqaule 、hashCode都忘了,完全失去了主导地位。靠下次一定要把面试官往自己擅长的领域引导。接着又谈到怎么判断Socket是否断开?我弱弱回答心跳算不算。哎……凌乱了,后台查了下,判断下读流时返回时否为-1应该比较正确。诸如此类的问题,机关枪似地向我扫射,我死得不能再死了。还好,哥们只是个打酱油跑龙套的,不在乎。最后问我是否能转lua开发,终于暴露了。其实挺不愿意的,我还是喜欢java,因为比较懒,习惯了eclipse的重构,自动提示,丰富的插件,习惯了无所不能的jar包。可是我还是口不对心的回答了可以。他说好,那能啥时候到岗呢?我说一个月,他说太长了。最后讨价还价2周。好吧,你还没确定给我offer呢?先要我打包票?。接着我问了下薪资,比我现在的外包公司高,至少10k。但是我是做java过来的,估计会少点。靠!重要的是加班严重,前两天刚有个IBM的姑娘死在地铁口。靠!等通知,最迟周一会有复试的通知。好吧,我承认,被刷了,而且很惨,没找到主场的感觉。
以上基本是今天下午的笔试面试情况了。总结如下:
其一 基础在那里,但没系统复习,会在笔试和面试中出现很多掉分的情况。虽然有经验,但不记不背,显得不够专业,不够全面,不够精确,一个没经验的背书狂都会表现比你优秀。
其二 面试时,当面试官不引导你去说你熟悉的东西时(我觉得这样的面试官不是好面试官,今后共事时,肯定也会忽略掉你的很多想法和感受,造成很多不愉快),要主动引导面试官去问你熟悉的,拿回主战场。其实我有两点可以说说,其一熟悉的设计模式,其二在职的项目中的很多情况。线程优化,缓存优化,数据压缩,数据库备份,vba脚本等。
其三 大胆地去忽悠。一个星期辞职?可以。哥反正是酱油哥,怕毛线,犹豫啥。到时候我不来,损失的又不是我。
明天的面试是步步高,但要求工作地是东莞。坚决不去东莞!鉴于是一次面试机会。再者,人家给我打了7个电话,其中4个没接到,2个是一个智联男猎头打过来的,还有一个是智联女猎头打过来的。同时给我发了3条短信,一封邮件。我靠,太给面子了。去吧,虽然跑龙套,希望不要被虐。
-----OVER---晚安
后记:博雅面试最后走到了终面,自己分析能顺利pass原因有4
1.愿意尝试lua脚本开发,虽然lua在游戏界很火,但用脚本作为工作语言是很多java程序员所不愿意尝试的;
2.第二面时碰到老乡了,很聊得来,交流很愉快;
3.第三面时能很清晰地讲讲解了目前项目自己主要负责的模块的设计原理和实现,给面试官留下逻辑思维清晰的印象;
4.3年开发经验要求工资不高
最后拒绝了这份工作,因为最后发offer时开的工资(8k)与目标工资相差太多。
步步高地面试也顺利通过,最后还是决定进这坚决不去的公司。原因有5:
1.工作地点在东莞,公司提供10元/平米的宿舍,能在一定程度上降低我的消费成本,解决经济问题的燃眉之急;
2.平台比较好,虽然比不上华为,BAT这些超级公司,但在国内知名度很高,能在一定程度上镀金;
3.描述的工作氛围好,这只是描述,实际还需考察,如果企业能有一个良好的氛围,绝对能为自己省心不少,能在一定程度上促进自己进步和提高;
4.福利待遇还不错,能给出期望值;
5.外地户籍的孩子能在本地公立学校读书到初中,这对于最终定居地点不确定的我来说,省下了来回迁户口的繁琐。
哎……
深圳--博雅互动 Android面试打酱油归来的更多相关文章
- Android面试一天一题(1Day)
写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...
- Android面试总结 (转)
1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...
- 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18) eoe上看到的
===============eoeAndroid社区推荐:======================= 1.Android开发新浪面试题[开发者必看哦]下载地址 http://www.eoeand ...
- Android面试题目及其答案
转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...
- Android面试题目2
1. 请描述下Activity的声明周期. onCreate->onStart->onRemuse->onPause->onStop->onRestart->onD ...
- 百度的android面试总结分析
今天就是今天上午10点,我接到了百度的电话面试,当然提前和我说了,我的拖延症是有多强烈,以至于我没怎么准备,当然我也想着看看自己的真实水平,在此检讨一下!!!!!!!!!!!!!!!!!!!!!!!! ...
- Android面试之高级篇
结合自己之前去很多大公司的面试经历和自己面别人的一些题,这里做一些总结,Android面试中常见的面试题. 1,Android的Handler运行机制 要解释Handler的运行机制就要讲几个对象:M ...
- Android 面试问答
Android 面试问答 目录 数据结构和算法 java核心知识 Android核心知识 架构 设计相关问题 相关工具和技术 Android 测试驱动开发 其他 数据结构和算法 ******关于此类问 ...
- Android面试优雅地介绍自己的项目
本文转载:m.blog.csdn.net/iamsamzhang/article/details/51916584 先说句题外话,很多公司16年秋招的内推已经开始啦,我目前知道的在北京有网易.百度和微 ...
随机推荐
- 201521123083 《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains public ...
- 201521123024 《Java程序设计》第4周学习总结
1. 本周学习总结 2. 书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 2.面向对象设计(大作业1,非常重要) 2.1 将在网上商 ...
- Java中如何引入结对编程
引自微信: 很多同学说: 我程序写得好,ACM比赛能得分, 就好了,软件工程讲的那些有用么? 有些学校的 <软件工程>课,由于要求太简单,反而不能说明软件工程的价值. 其实好办, 让学生结 ...
- Java课程设计—学生成绩管理系统(201521123005 杨雪莹)
一.团队课程设计博客链接 学生成绩管理系统 二.个人负责模块或任务说明 学生成绩录入 显示所有学生信息 显示各科平均成绩 显示学生成绩(按降序排序) 三.自己的代码提交记录截图 四.自己负责模块或任务 ...
- 201521123075 《Java程序设计》第11周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...
- 解决Maven管理的项目下"Missing artifact xxx bundle"问题
例如使用maven编译使用了mina的包的工程,出现如下提示: [INFO] Scanning for projects... [INFO] ...
- jQuery基礎知識
jQuery基礎知識 $(function(){}) //jQuery先執行一遍再執行其他函數 $(document).ready(fn) //文檔加載完後觸發 1. 刪除$:jQuery.noCon ...
- shell脚本进阶之条件测试与条件语句
接着上篇博客,今天整理一下关于条件测试和条件语句方面的知识. shell脚本进阶之条件测试 在编写shell脚本时,经常需要对一些条件进行判断,可以使用测试命令test辅助完成测试过程.t ...
- [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...
- hdu4704 Sum 2013 Multi-University Training Contest 10 数论题
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...