转载出处:http://www.nowcoder.com/discuss/3244?type=2&order=0&pos=1&page=1java
和大多数的面经不一样,我不是大牛,手头也没有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 比较多,技术那边以为至关符合指望,薪资比以前谈的还要高了一点。瞬间以为以前受的背运白眼都有了回报,真是苦尽甘来了。
就在答应过几天去美图签三方了,结果求之不得的腾讯忽然打电话来技术面试,想起原来是社招的投的简历,问的问题至关有难度,答的磕磕巴巴的,觉得没戏了,晚上打电话来又要求到总部面。感受本身像个快结婚的人了,忽然学生时代的初恋女神过来撩拨一下你,明知不可能却又心存侥幸,心情起起伏伏又患得患失,人生的精彩不过如此吧。最后再次与腾讯失之交臂,加入了美图。
最后分享一下干货,是我在面试美团,今日头条,网易,腾讯等公司时候遇到的面试题,但愿能给你们接下来的面试带来帮助!若是我有哪里写得不对的,欢迎知乎私信我!
我的知乎连接http://www.zhihu.com/people/hong-lou
J2EE 部分:
- Switch可否用string作参数?
- equals与==的区别:
- equals是比较两个对象的值是否相等,而==比较这两个是不是同一对象
- Object有哪些公用方法?
- 方法equals测试的是两个对象是否相等
- 方法clone进行对象拷贝
- 方法getClass返回和当前对象相关的Class对象
- 方法notify,notifyall,wait都是用来对给定对象进行线程同步的
- Java的四种引用,强弱软虚,用到的场景
- 强引用:若是一个对象具备强引用,它就不会被垃圾回收器回收。即便当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。若是想中断强引用和某个对象之间的关联,能够显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
- 软引用:在使用软引用时,若是内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。
- 弱引用:具备弱引用的对象拥有的生命周期更短暂。由于当 JVM 进行垃圾回收,一旦发现弱引用对象,不管当前内存空间是否充足,都会将弱引用回收。不过因为垃圾回收器是一个优先级较低的线程,因此并不必定能迅速发现弱引用对象
- 虚引用:顾名思义,就是形同虚设,若是一个对象仅持有虚引用,那么它至关于没有引用,在任什么时候候均可能被垃圾回收器回收。
- 使用场景:
- 利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题
- 经过软可及对象重获方法实现Java对象的高速缓存:好比咱们建立了一Employee的类,若是每次须要查询一个雇员的信息。哪怕是几秒中以前刚刚查询过的,都要从新构建一个实例,这是须要消耗不少时间的。咱们能够经过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另外一方面是取出引用,缓存中是否有该Employee实例的软引用,若是有,从软引用中取得。若是没有软引用,或者从软引用中获得的实例是null,从新构建一个实例,并保存对这个新建实例的软引用
- Hashcode的做用,与 equal 有什么区别
- 一样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不容许元素重复实现,那个这个不容许重复实现的方法,若是用 equal 去比较的话,若是存在1000个元素,你 new 一个新的元素出来,须要去调用1000次 equal 去逐个和他们比较是不是同一个对象,这样会大大下降效率。hashcode其实是返回对象的存储地址,若是这个位置上没有元素,就把元素直接存储在上面,若是这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其余地址上
- String、StringBuffer与StringBuilder的区别
- String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象
- StringBuffer和StringBuilder底层是 char[]数组实现的
- StringBuffer是线程安全的,而StringBuilder是线程不安全的
- Override和Overload的含义去区别
- Overload顾名思义是从新加载,它能够表现类的多态性,能够是函数里面能够有相同的函数名可是参数名、返回值、类型不能相同;或者说能够改变参数、类型、返回值可是函数名字依然不变。
- 就是ride(重写)的意思,在子类继承父类的时候子类中能够定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类至关于被覆盖(重写)了。
- 抽象类和接口的区别
- 一个类只能继承单个类,可是能够实现多个接口
- 接口强调特定功能的实现,而抽象类强调所属关系
- 抽象类中的全部方法并不必定要是抽象的,你能够选择在抽象类中实现一些基本的方法。而接口要求全部的方法都必须是抽象的
- 解析XML的几种方式的原理与特色:DOM、SAX、PULL
- DOM:消耗内存:先把xml文档都读到内存中,而后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,可是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机
- SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数作相应动做,而后继续一样的扫描,直至文档结束。
- SAX:与 SAX 相似,也是基于事件驱动,咱们能够调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时能够调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。
- wait()和sleep()的区别
- sleep来自Thread类,和wait来自Object类
- 调用sleep()方法的过程当中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
- sleep睡眠后不出让系统资源,wait让出系统资源其余线程能够占用CPU
- sleep(milliseconds)须要指定一个睡眠时间,时间一到会自动唤醒
- JAVA 中堆和栈的区别,说下java 的内存机制
- 基本数据类型比变量和对象的引用都是在栈分配的
- 堆内存用来存放由new建立的对象和数组
- 类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中
- 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不必定是连续的空间分配给变量,是根据零散的堆内存地址,经过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并非立刻就释放堆中内存
- 局部变量: 由声明在某方法,或某代码段里(好比for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离做用域,内存当即释放
- JAVA多态的实现原理
- 抽象的来说,多态的意思就是同一消息能够根据发送对象的不一样而采用多种不一样的行为方式。(发送消息就是函数调用)
- 实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码能够发现,JVM 经过参数的自动转型来找到合适的办法。
- JAVA 垃圾回收机制
- 什么是垃圾回收机:释放那些再也不持有引用的对象的内存
- 怎么判断一个对象是否须要收集?
- 引用计数(最简单古老的方法):指将资源(能够是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程
- 对象引用遍历(如今大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条连接,递归肯定可到达(reachable)的对象。若是某对象不能从这些根对象的一个(至少一个)到达,则将它做为垃圾收集
- 几种垃圾回收机制
- 标记回收法:遍历对象图而且记录可到达的对象,以便删除不可到达的对象,通常使用单线程工做而且可能产生内存碎片
- 标记-压缩回收法:前期与第一种方法相同,只是多了一步,将全部的存活对象压缩到内存的一端,这样内存碎片就能够合成一大块可再利用的内存区域,提升了内存利用率
- 复制回收法:把现有内存空间分红两部分,gc运行时,它把可到达对象复制到另外一半空间,再清空正在使用的空间的所有对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则致使效率下降。
- 分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特色是对象会很快被回收,所以在年轻代使用效率比较高的算法。当一个对象通过几回回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采起标记-压缩算法
- 讲讲 Java 中的集合有多少种,区别是什么?
- ArrayList、LinkedList、Vector的区别:ArrayList 和Vector底层是采用数组方式存储数据,Vector因为使用了synchronized方法(线程安全)因此性能上比ArrayList要差,LinkedList使用双向链表实现存储,随机存取比较慢
- HashMap的底层源码实现:当咱们往HashMap中put元素的时候,先根据key的hashCode从新计算hash值,根据hash值获得这个元素在数组中的位置(即下标),若是数组该位置上已经存放有其余元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最早加入的放在链尾。若是数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
- Fail-Fast机制:在使用迭代器的过程当中有其余线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast机制。这一机制在源码中的实现是经过modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增长这个值,那么在迭代器初始化过程当中会将这个值赋给迭代器的expectedModCount。在迭代过程当中,判断modCount跟expectedModCount是否相等,若是不相等就表示已经有其余线程修改了Map.
- HashMap和 HashTable 的区别:
- HashTable比较老,是基于Dictionary 类实现的,HashTable 则是基于 Map接口实现的
- HashTable 是线程不安全的, HashMap 则是线程不安全的
- HashMap可让你将空值做为一个表的条目的key或value
Android部分:
- 注册广播有哪几种方式,有什么区别
- 绘制 Activity 的生命流程图
- 注册Service须要注意什么
- Service与Activity怎么实现通讯
- Handle通讯具体到源码,是怎么实现的
- Handle的机制
- 怎么实现ListView多种布局?
- ListView与数据库绑定的实现
- 怎么实现一个部分更新的 ListView?
- ListView卡顿的缘由与性能优化,说的越多越好
- Android中的动画有哪些,区别是什么
- JNI怎么使用
- 说说内存泄露的状况有哪些
- OOM是怎么引发的?怎么尽可能避免 OOM 问题的出现
- 什么是 ANR 问题?为何会引发 ANR 问题?
- Socker编程的步骤
- 设计一个图片缓存加载机制
- Fragment嵌套多个Fragment会出现bug吗
- Activity中如何动态的添加Fragment
- 内存不足时,怎么保持Activity的一些状态,在哪一个方法里面作具体操做?
- Scrollview怎么判断是否滑倒底部
- ViewPager 的怎么作性能优化
- Asynctask具体用法?
- Asynctask的Do in background方法是怎么通知UI线程刷新进度条的?
- Asynctask的Do in background方法默认是返回 true ,表示任务完成,若是想返回具体的数据呢,怎么作。若是Activity被销毁了,还会执行到postexcutd方法吗?
- View中onTouch,onTouchEvent,onClick的执行顺序
- 不使用动画,怎么实现一个动态的 View?
- Postvalidata与Validata有什么区别?
- Asset与raw都能存放资源,他们有什么区别?
- 如何自定义ViewGroup?
- 什么是 MVC 模式?MVC 模式的好处是什么?
- JVM 和Dalvik虚拟机的区别
- 应用常驻后台,避免被第三方杀掉的方法,讲讲你用过的奇淫巧技?
- 数据持久化的四种方式有哪些?
数据结构与算法部分:
- 给最外层的rootview,把这个根视图下的所有button背景设置成红色,手写代码,不准用递归
- 给一串字符串好比abbbcccd,输出a1b3c3d1,手写代码(注意有个别字符可能会出现十次以上的状况)
- 一个序列,它的形式是12349678,9是最高峰,经历了一个上升又降低的过程,找出里面的最大值的位置,要求效率尽量高
- 二叉查找树的删除操做,手写代码
- 反转链表,手写代码
- 二分查找,手写代码
- 有海量条 url,其中不重复的有300万条,如今但愿挑选出重复出现次数最高的 url,要求效率尽量的高
- 一篇英语文章,去掉字符只留下k个,如何去掉才能使这k个字符字典序最小
- 弗洛伊德算法和 Dijkstra算法的区别?复杂度是多少?讲讲 Dijkstra算法的具体过程
- 反转字符串,要求手写代码,优化速度、优化空间
- 给出两个无向图,找出这2个无向图中相同的环路。手写代码
- 单例模式,手写代码
- 生产者与消费者,手写代码
- 二叉树镜像,手写代码
- 最长不重复子串(最长重复子串),手写代码
操做系统部分:
- 分别从操做系统的内存角度与进程线程角度解释分析堆,栈两者的区别
- 什么是事务?
- OSI七层模型有哪些,各层次的做用
- TCP的三次握手过程,四次挥手过程,为何须要三次?
- 说说操做系统中进程的通讯方式
- 浏览器输入地址以后,以后的过程
- 谈谈 HTTP 中Get 和 Post 方法的区别?