实习面试经历问过的那些题

来源:互联网 发布:xiniu软件 编辑:程序博客网 时间:2024/05/05 09:13

开一篇博客,记录这段时间经历各种面试,

阿里一面 3月14日 30分钟

1.自我介绍

blablabla….强烈推荐实现准备好一个自我介绍的txt,直接对着读这样比较从容。


2.简单介绍一下拟开发过的项目,有没有碰到过什么难以解决的问题,是怎么解决的:

blablablabla,项目开发过程中碰到问题会上网查一些资料,在开源社区上
寻找解决办法。


3.有没有混过开源社区,有没有使用过一些开源的项目,看没看过开源项目的源码,使用过程中有没有发现开源项目的问题,并提出改进方式。

经常看的技术社区主要有csdn和github,使用过一些开源的项目,使用一些开源项目的时候会看一些项目的底层实现帮助理解这些开元项目(主要当时问我有没有尝试修改过开源项目的代码,我没有过,感觉直接这样说没有又不太好,于是给他扯看过一些源码)。


4.经常使用到的数据结构有哪些,链表用过吗?怎么实现的?

常用的数据结构有队列,栈和哈希表,链表的实现主要有单链表和双链表。


5.看简历上说你实现过IM的协议,怎么实现的?

主要是基于socket实现了实时通讯,通过BIO的方式,服务器一个线程轮询,当有客户端连接时,接收socket实例并且创建一个新的线程为客户端提供服务。通讯当中需要传递的数据封装成实体类,通过socket直接传递。然后离线的消息我们在服务器维护了一个消息队列,当用户上线时检查消息队列,将发送给他的消息取出。


6.是怎么保证消息是顺序到达的,图片和语音都是通过一个socket来进行传递的吗?

在客户端维护一个消息队列,当网络环境正常的时候从队列中去消息发送出去,当用户上线时先取离线消息,再接受新接到的消息。这样可以保证消息的接受顺序。图片和语音都通过一个socket来传输(这个地方估计答错了,感觉实现起来应该是通过别的办法)


7.TCP和UDP的区别,能不能在UDP的基础上实现TCP的可靠数据传输服务?

TCP是面向连接的可靠数据传输服务,相对于UDP能够提供的服务比较多,例如拥塞控制,流量控制,而UDP无连接的不可靠数据服务,不保证数据必须送到也不保证数据的顺序。

可以通过UDP实现TCP的可靠数据传输,应为TCP的底层IP提供的服务是不可靠的,TCP通过各种方法实现了可靠数据传输,我们只要知道可靠数据传输的原理就可以在不可靠服务的基础上实现可靠的数据传输。


8.你说写过C++,对C++有什么理解,说一说JNI和NDK是如何使用的?

C++和Java主要区别是指针区别,JNI和NDK是JAVA和C++混编的工具,JNI是Java提供的C库,之前的项目中使用到过这些技术,应为cocos2dx的项目有碰到过Java和C互调的情况。对着方面的知识有一部分了解。


9.讲一下使用过什么设计模式,如何实现,有什么要注意的地方?

这里我讲到主要使用的是单例模式和观察者模式:

单例模式的实现:私有化构造方法,创建静态的变量保存唯一的实例,并且创建静态的public方法为外部获取引用提供接口。

观察者模式的实现:通过写一个父类,维护一个集合用于管理所有的观察者,然后声明几个抽象的方法。用于通知观察者状态的更新。被观察者继承这个父类并且实现抽象的方法。再定义一个观察者的接口,观察者需要实现这个接口。当被观察者发生状态变化时通过父类的update方法对观察者进行通知就可以了。


10.讲一下单例模式的注意事项

需要注意多线程时单例模式的安全性问题,可以通过加同步保证单例的唯一性,通过双重判断来提高同步的效率,去除不必要的同步。


10.愿不愿意转IOS

…….还好我有准备,发现阿里老喜欢干这种事,我朋友去阿里面Android,碰到的一个面试官问他可不可以做IOS。当时朋友就懵逼了,结果今天面试也问我这个。看来现在Android方向的人太多了,准备转方向了。

最后总结一下,阿里一面的面试官还是很好说话的,问的问题也比较简单,都是计网数据结构的基础知识,并没有深入提问。后来问推我的那个学长,学长说面试官是他们组的,没有问太难的问题,让好好准备二面,准备被蹂躏 = = 。

阿里一面Again 3月16日 30分钟

的确是有一次一面,忐忑的面试完感觉还不错,结果最后问面试官问题面试官说这才是一面- -,内心是崩溃的,说是上次面试官操作失误,导致重新进行内推。

1.自我介绍


2.IM协议的实现,同时和多个人进行聊天是否需要维护多个Socket,有没有考虑数据的安全性,维护登陆状态是怎么做的。

我说和多人聊天需要维护多个socket,然后面试官语气就不对了,好吧,估计是回答错了。赶紧说当时没有试过做这种测试,比赛的时候也是两个人之间发,没有试过多个人。

数据安全性我只说到了密码使用了MD5进行加密,其他说没有考虑。安全性问题在后面的腾讯一面中也被问惨了,后面应该要好好准备一下。

登陆状态的维护,答的是使用心跳包,客户端不断的给服务器发心跳包,来告诉服务器自己在线。


3.LRUCache内部是怎么实现的?LinkedHashMap有什么特点,为什么要使用LinkedHashMap,不使用ArrayList。

LRUCache内部使用LinkedHashMap实现,LinkedHashMap本质上是一个链表,具有顺序,并且可以实现按照访问先后对内部节点进行排序的特点。这样就可以很方便的实现LRU缓存。

LinkedHashMap底层是链表,链表的移动节点和删除增加节点的操作速度快,而ArrayList的内部实现是数组,数组的节点删除速度和添加速度都很慢。


4.遇到问题时如何解决。

主要说到几个技术社区,提到github,stack over,csdn,开源中国。


5.计算机网络有那些层,你认为socket属于那一层。

5层 ,应用层,传输层,网络层,链路层,物理层。socket属于传输层和应用层之间。属于传输层到应用层之间的通道。


6.你认为UDP可以实现TCP的服务吗?如何实现。

可以,TCP是可靠数据传输但是TCP的下层IP提供的服务是不可靠的,TCP在IP的基础之上实现了可靠数据传输,只要我们知道了TCP内部的一些可靠数据传输的原来就可以基于UDP实现可靠数据传输。


7.使用过什么数据结构,解决了什么样的问题。

Android的开发中用到数据结构最主要的地方是缓存优化,这里主要讲到用到过队列来解决消息发送的顺序问题,还有就是用到栈来实现LRUCache,讲到LinkedHashMap的实现是链表,其实本质上也是一个栈。


8.如何通过数据库来存储聊天记录,数据库怎么建表。

第一次考到数据库建表,说用发送方和接收方来唯一标示一个对话的聊天记录然后再来一些属性。

这一次阿里一面的面试官给的压力还蛮大的,问题很深入,基本上我答出来之后他会对着我的答案继续问,总感觉想把我问道倒,不过最终整个流程下来感觉面试的效果还不错,内推的学长说网络部分有待加强,估摸着是IM的部分没回答好,默默的准备二面吧。

腾讯一面 3月16日 50分钟

下午刚刚面完阿里,晚上腾讯又打电话来了,精神高度集中了一整天,当天晚上人已经快挂掉了。下面总结一下他问的题

1.讲一下你做的项目,你负责什么,碰到过什么问题,怎么解决的。

依旧讲的IM,感觉IM部分现在所有的面试讲到最多,也被问出了很多问题,最近一直在解决各种这方面的问题,应为下午被阿里的面试官提到多人聊天时维护多个socket是错误的,所以下午去查,想到可以使用UDP,这样就可以避免需要维护多个连接了,结果晚上又被问如何保证数据的传输的可靠性。说可以再UDP基础上实现可靠数据传输,然后使用去除TCP的流量控制,拥塞控制部分。(心想这么答估计也是有问题的,准备再去查一下QQ,微信的实现)


2.数据采用的是什么形式进行传递,为什么不用Json?图片的数据也封装在类中吗?图片有没有考虑可以分组发送。

数据传输使用自己封装的类,然后序列化后直接传输的,不用Json的原因是应为Json没有办法传递图片和语音这种类型的数据。

图片采用的是先发一个实体类,然后再发数据这样的流程,没有考虑可以分组发送。他这里说到可以分组,并且使用一些现有的框架来实现。


3.客户端和服务器如何建立连接?为什么不考虑直接使用Http协议来做?简单的介绍一下Http协议。开发过程之中有没有使用到过Http头部

客户端服务器建立连接主要是通过socket来建立的(他问裸socket吗?心想估计又答错了),Http没有考虑过,不过知道Http有持久连接,应该可以通过Http来进行实现。

Http协议是超文本传输协议,协议包含协议头部和数据部分,主要有post和get方法。

开发过程中很少使用到Http头部,不过有在别的开源项目中看到对Http头部解析的例子,例如Volley的源码中,通过Http头部解析来避免不必要的图片加载。其实面试完自己想了一下,自己在开发过程中也有使用过Http头部,在多线程下载的时候,可以通过Http头部规定读取数据的范围。应为Http头部是不定长的,有一些可选项。


4.除了数据连接这种较为底层的部分,有没有对尝试开发过其他的部分?介绍一下View的绘制流程,事件分发机制?

View的绘制过程主要包括Measure,Layout和Draw。自定义的view首先要通过onMeasure方法来固定view的大小,然后需要实现它的onDraw方法。在Draw中将控件画出来。讲到QQ的下拉水滴效果,大量的数学公式。

然后提到事件分发机制,说当时自己做滑动删除的时候碰到过滑动冲突的问题,然后后来也没有很好的解决(这里说到ViewPager内部嵌套带滑动删除的ListView)事件分发机制其实自己也有点不太记得了,没怎么答。


5.如何解决ListView加载图片卡顿或OOM的问题?LRUCache如何使用?除了软引用还知道什么引用?有没有做磁盘缓存?UIL的代码看过吗?

先讲到convertView + ViewHolder的办法来进行View的复用。

自己一开始做的时候使用的是AsycTask+LRUCache+软引用集合来实现内存当中的二级缓存。讲到LRUCache的特点。

强引用,软引用,弱引用,虚引用。常用的是前两个,后两个只是知道但是并没有用过。

没有做磁盘存储,因为后来直接使用了第三方的网络图片加载库,例如Volley和UIL。问到有没有看过UIL的源码。答没有,但是知道一些UIL的实现思想,他说UIL的内部数据结构设计的很精妙,有时间可以看看(最近准备开刷UIL源码了)


5.HashMap的实现,如何解决冲突?

讲到为每个元素计算一个Hash值,Hash值即为该元素的位置。

冲突解决方式有以下几种:

  • 开放定址法 :从冲突位置开始,寻找空位
  • 再Hash法:多个Hash函数
  • 链接法:同一个Hash值后面保存一个链表,将相同的存放在链表中
  • 溢出法:将重复的放在溢出桶中

6.SQLite数据库用过吗,心电数据如何存储,为什么要存多文件不存单文件?

使用过SQLite,开发过程中一般采用单例的办法来管理这个数据库操作类。心电数据的存储是通过文件存的方式来实现的。不存数据库的原因是数据量可能会比较大。所以存文件。

多个文件方便操作,并且如果数据库建表的话也方便与为每条记录添加文件的路径。


7.介绍一下Android应用中有哪些线程。如何跨线程传递超大数据?

讲到有UI线程和其他的一些线程(感觉应该漏了)。

跨线程传递大数据讲到了不能使用Handler,可以考虑在Controller中定义变量,使用观察者模式在数据获取完毕以后通知要更新的界面进行数据更新(估摸着又错了,想到Handle的message可以携带Object对象,应该可以直接传递,准备一会去查一下)


8.Java和C++的区别?Java GC的实现原理有哪些?现在的JDK版本中使用的GC机制是什么?

Java和C++的区别是Java有GC而C++没有。

GC的实现原理当时答出来了5个:

  • mark/swap
  • 引用计数
  • 压缩
  • 分代
  • 拷贝

主要详细介绍了一下引用计数,说在比较早的版本里面的JDK使用的是引用计数,后来换了。然后他说Java现在使用的是引用链,然后分代管理。具体的也没细说。(这部分估计还会被问到,准备好好看一下)


9.小量数据为什么不用SharePreference存?SharePreference的内部结构?

解释说当时的数据量还是蛮大,没有考虑使用SharePreference,说到使用SharePreference的情况基本上都是记住密码和记住登录状态之类的。结果又一次自己作死说记住密码一般不使用SharePreference而是在服务器实现。

SharePreference的内部是xml结构的,所有内容都是明文。


10.如何进行调试?程序报错如何解决?有没有遇到过ANR?如何定位ANR?

说到使用如果是报异常就直接使用Logcat+BreakPoint的方式,程序开发中没有碰到过ANR。但是知道ANR的发生情况一般就3种:

  • 主线程阻塞超过5s
  • BoardcastReciver处理的事情过多
  • Service阻塞

面试官:如果发生ANR,可已通过Logcat和trace.txt定位。


11.编写布局有没有考虑过避免重绘?如果对其他APP的界面布局感兴趣有什么办法了解他的布局?merge布局的作用和特点?

Android开发者模式下开启绘制布局边界可以看到所有布局的边界线。通过这个办法可以了解其他App的布局情况。merge布局当时胡说八道一通感觉GG,回去一查果然打错了。这里补上merge布局的用处和特点。

Android在绘制布局时会在所有布局的根节点外面套一层FramLayout,有时写子布局时外面会在最外面嵌套一层布局,但是最外层已经有一层FrameLayout了,这样就会导致重绘。但是布局文件又不可以没有根节点。这时我们就需要使用到merge节点。这个节点在绘制时会被略过,内部内容会被直接加到merge的父布局当中。有效的避免了重绘。

腾讯的一面面试官感觉给的压力还是蛮大,而且问了很多Android平台相关的问题,这和阿里一面偏重数据结构和网络有很大区别。整个面试时间很长,而且面试官虽然问的问题很细很多但是最后都会讲解一些对这个方面的理解和学习的参考意见。继续默默的等二面吧。

腾讯二面 3月21日

这么多次面试压力最大的一次,可能是二面,面试官问问题的方式就给人一种压迫感。现在回想起来估计已经挂了。整理一下面试题吧:

1.如何实现网络通讯中的数据加密?

DES+RSA模式的数据加密。对称加密传递数据,非对称加密传递秘钥。


2.单例模式如何实现,注意点,为什么双重判断可以提高效率。

实现方法:blablabla。
注意点,使用延迟加载时,多线程下的安全问题,使用同步,并且使用双重判断提高效率。
双重判断能够避免不必要的同步,同步过程耗时,需要上锁和释放锁。


3.Android Studio启动App的快捷键?

Alt + shift + x,当时没答上来,被问到这个也是有点懵逼


4.算法题,统计一段英文段落中出现的单词,并且得出出现最多的单词的个数

代码略

后来又问了几个有关这个算法题的问题

1.如何避免大小写字母的影响?
将所有单词字母的大小写统一。

2.如何保证将一个单词的单数和复数都能统计为同一个单词?
需要提供单词单复数的字典。

3.单复数字典的数据结构如何实现?
没答上来。

4.如何保证在新提了各种需求的前提下尽量少的修改你的核心代码?
说的是将函数拆分成3个函数(感觉也是答错了)


总结:腾讯二面结束,整个面试流程很短,感觉表现很差,面试官压力给的很大,让人有种来不及思考的感觉。这么多次面试第一次被要求做题,也没有想到会根据题目继续提问。还是准备不足。继续准备其他面试吧。

0 0
原创粉丝点击