阿里面试2(转)

我说我在Java上做了10年,做过了某些项目,担任了某些角色,解决了什么问题,用到了什 
么技术,写过哪些通用框架。我也不知道他听懂了没有,他没有对我的简历没有任何问题, 
他就开始问了让我汗颜的技术问题:“你知道Object对象有些方法?” 
我一听就呆了,我真的没有去认真记,我估计他是想问关于并发和泛形的问题吧,我说我没 
特意去记,如果用到并发和多线程的话主要有wait和notify,常用的clone,toString,equals 
等。他接着问我wait和sleep有什么区别,我一听又晕了,Object有sleep方法吗?我怎么不 
知道的,我很淡定地说,sleep是对象自己休息了一会儿,然后时间到了就自己醒来继续干活 
,而wait,是要别人通知它醒来干活。 他接着问:“inputstream和reader有什么区别?” 
我心头又一震,这么高深的问题,我还一时还真的说不出来,我继续淡定:“inputstream是 
读二进制流的,reader通过指定编码而读取不同格式的编码,比如UTF8或GBK之类的。” 
第三个问题,“List有几种实现?” 
这个问题我考过无数面试者,我觉得这只是例行的问题,我很干脆地回答,ArrayList和Lin 
kedList,ArrayList的数据结构是数组,LinkedArray是链表,如果插入和删除的操作较多, 
可以考虑用LinkedArray,如果是修改或查询数据,用ArrayList比较合适。 
第四个问题,“如何理解Hashmap?” 
我实在看不出有什么难度,我说Hashmap就是key对应value的一种结构体,Hash是一种快速检 
索算法,非顺序存储,不能前缀检索,不支持太大的数据量,一般来说几万条没问题,通常 
可用来做缓存机制,而数据库索引一般用btree而不会用到hash算法。 
我觉得这些问题都是Java的基础,我应聘的是架构师,我等待着更有深度的问题。“谢谢你的 
面试,如果合适我们过两天会有人跟你进一步的联系的。”我一听这话几乎晕倒,继续淡定地 
问:“据我所知所有的复试都会在今天完成,听您的意思我不太合适,请问可以告诉我原因吗 
?” 结果已定,我只是想知道为什么! 
面试官说了我没有一个问题回答正确,我完成不懂hashmap,hashmap在超大数据量如几千万条 
记录时,会有可能出现hash碰撞,不同的key有可能被覆盖。 
我晕,我写了这么多年的java真的没遇过这事,阿里的系统就么猛连hashmap都会因为数据量 
过大而出错?我直说我真的没遇过这事,我用hashmap最多就处理过10万左右的记录,2GB的 
JVM内存都提示内存溢出,即使控制在5万条之内,虽没内存溢出都感觉到检索的速度慢了很 
多,比数据库要慢多了,所以我认为太多的数据不应该在Hashmap处理,而是应该交给数据库 
去计算,我用hashmap写业务逻辑一般控制数据量在5000条左右为上限。我回来google了关于 
hashmap会出现碰撞的问题,但查到的结果是有碰撞是正常的,但绝不会出现不同的KEY会因 
为hashcode相同而覆盖,这跟我的理解完全一致,碰撞会影响性能,但不会出错。另外,有 
一个前提是KEY的hash算法别写错,而且hashcode()返回是int型,不知道面试官指的KEY会被 
覆盖是否是因为int类型的问题了,如果是这个问题的话,我早在2003年就已经解决过,根本 
就不是问题,但已经无法求证他的想法。 
面试官说我不懂处理超大数据的系统,我说如果真的有这问题也不难解决啊,换一个能处理 
大数据的hashmap就好了,或者用memcached,用C写的,性能比JAVA强多了,用得着这么复杂 
吗,我问那你会如何处理,他说可以考虑hashtable或vector或其他的JAVA类,我说hashtab 
le和vector是线程安全的,性能比hashmap要慢,但有并发时肯定不能用hashmap。我现在想 
他是否把并发问题造成的key覆盖与大数据量时hashcode所造成的KEY覆盖搞混了,否则怎么 
会把问题扯到并发上来。 我说OK,我的确不知道这问题,但是就这问题你就否定我了吗? 
面试官说还有很多,比如我不懂inputstream和reader的区别,我说就是一个支持编码一个不 
支持编码,我这个回答有问题吗?那正确的答案是什么呢? 
面试官说reader是按字符读取的。我又晕,只要对java有一点经验的人都知道这点吧,一个 
读byte一个读char。我说我的回答也对啊,指定编码就是为了按字符读取啊。他又说我你知 
道UTF8,GBK,GB18030和unicode的区别吗?reader为什么能转换不同的编码,我说UTF8就是 
unicode,汉字占3个字符,GB18030包含了所有的汉字,一般来说用GB2312也就足够了,但U 
TF8更通用,JAVA内核用unicode处理字符的,所以编码转换成任何编码格式都是自然而然的 
事,我们开发不需要关心这细节,当出现乱码时一般就是编码有误,转换一下就行了。我感 
觉我一直在跟一个java小学生在聊天,而且我还是该小学生的学生。 
我问了我很关心的一个问题,请问你们公司的Java架构师主要的责任就是写这些hashmap吗? 
面试官回答我说,我们公司的架构师都做要经常写hashmap,要处理系统的一些BUG,要明白 
其中的原理才能解决问题。 
我已经有点冲动忍不住说了:每个人的知识面都是有限的,时间也是有限的,不一定所有的 
场景都会接触到,这些技术问题每个公司都应该积累了不少相应的解决办法,而且网上随便 
都能google一堆解决思路和办法,当遇到时自然就能解决,一个有能力的人不能光看他做过 
什么,没做过什么,而是要看他的学习能力,解决问题的能力才是最重要的。架构师要考虑 
的不仅仅是代码,而是要从整个系统去考虑,要分析子系统之间的关系,数据架构,开发架 
构,用户需求等方面。 
面试官表示很淡定:我觉得我要求的就是要这些,你不符合我的要求。 
面试已经束,回家。 

这股不对劲的味,我想应该是官僚味吧,整个面试过程HR部门并没有参与,阿里方表现得非 
常随意,感觉是较低档次的面试会,这种情况是我这两年来已经很少遇到的了,或者阿里比 
较牛,高手如云,不太在意从外部招聘人才吧。但是,这样的面试,通过面试的人能感受到 
阿里对人才的认同感吗?进去之后是否要面对更多的官僚问题呢?不得而知。 

我知道我自己一定做错了什么,或者我的水平真的不行,或者阿里并不需要像我这样的人, 
或者阿里hr并没有告诉我,我面试的只是初级程序员的职位,或者我应聘的渠道错了,或者 
我遇到了错误的面试官,或者,我没告诉阿里,其实我不懂java。 

实在让我很羞愧,让阿里的JAVA同行见笑了。 

posted on 2014-04-12 22:52  Java码界探秘  阅读(70)  评论(0编辑  收藏  举报

导航