1、说说你对面向对象的理解
附:
(感觉这篇百度经验讲得很生动:如何理解面向对象)
面向对象是基于万物皆对象这个哲学观点. 把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的.
面向对象具有封装性,继承性,多态性.
封装隐蔽了对象内部不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信.封装性降低了编程的复杂性.
通过继承,使得新建一个类变得容易,一个类从派生类那里获得其非私有的方法和公用属性的繁琐工作交给了编译器. 而继承和实现接口和运行时的类型绑定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,极大地提高了代码的通用性.
总之,面向对象的特性提高了大型程序的重用性和可维护性.
(参考:http://blog.csdn.net/dayuqi/article/details/8095665)
------<记最近的面试经历>------
(上海)乐其网络科技有限公司---软件开发实习生
下午从嘉定花了一小时一刻钟到达公司所在的长宁区(15:00),首先面临的就是HR给了我一套笔试题和个人信息表。
笔试题为3道算法题:
1、给了一个递增二维数组(即行和列的数字都是递增的)和一个整数,判断这个整数是否在此二维数组中。要求写一个算法,分析算法复杂度,给出最优的算法!如:二维数组为
1 2 4 6 9 整数为:9
2 4 5 7 11
5 6 8 9 13
7 8 9 12 15
思路:
2、一个递增数组,将其前面一部分旋转到尾部,写一个算法求此数组中的最小值,并分析算法复杂度。如:输入7 8 9 1 2 3 4 6,输出为1
思路:
3、给定一个字符串,求出所有的字符串组合情况!如:“abc”—>"a","b","c","ab","ac","bc","abc"
思路:
一面:
面试官是一个研发工程师,正好之前在我去年实习过的欧特克公司工作过!具体问的技术问题为:
1、说说get和post的区别
2、说说session和cookie的区别
3、说说什么叫多态?()
4、说说你知道的c语言中常用的关键字,我说了extern和static及auto,然后他说可以了,那具体说说extern和static的用法吧
。。。。。。
二面:
另外一位技术人员,继续给我出算法题:
1、蛇形矩阵的几种变形情况下的算法(给我出了几个我都见过,然后就跳过了)
2、一道很简单的题:
一个矩形,长为a,宽为b,且满足条件:a<=c,b<=d,求在此矩形等比缩放达到面积最大的情况下,长和宽的取值。
3、有没有自己想深入了解的技术方向,或最近在专研些什么技术
。。。。。。
三面:
HR面
1、介绍下自己
2、问我有没有女朋友,以及父母是做什么的,家境如何等等
3、目前找实习都投了哪些公司?以及情况如何?如果给你机会,你最想去哪个公司?为什么?
我说之前投过百度,腾讯,微软,招商银行信用卡中心,中国银联,EMC和携程等等,如果给我机会,我最想去腾讯,原因是:一方面跟我目前所学方向比较对口(腾讯主要是招C++相关的吧),而是感觉腾讯的企业文化比较好,技术大牛也比较多能学到很多东西等等
4、在公司里你期待一种什么工作状态?为什么?
5、除了学习吗,你平常都喜欢做些什么?为什么?
我说喜欢运动如:跑步(对参加各种跑步活动或比赛比较感兴趣),打羽毛球、乒乓球等等,偶尔也喜欢去K歌吃大餐等等~
我解释了喜欢跑步的原因:一方面跑步是能享受一个很好思考和沉下心来的机会(喜欢那种放空抑或沉思的状态),二是作为一种全身性的运动,跑完后人会特别清爽等等~
6、对自己未来的职业规划
7、对实习薪资的要求
8、我想了解的问题
。。。。。。
四面:
项目经理面
1、介绍下自己
2、看你的项目经历什么的挺丰富的,稍微介绍下吧
3、之前你的实习经历都是软件公司,而你投简历面试的公司有银行,互联网,软件等,你对自己的职业方向有明确要求吗或者说你最想从事哪一方向?
4、讲了下公司里各部门之间的关系或者说合作机制,问我的看法
5、我有什么问题想问
我问的问题:
1、我知道贵公司是做母婴电商这一块的,可以简单概述下公司的业务和架构吗?
答:公司是由一位前谷歌资深技术工程师与2007年在杭州创立的,读书经历是在美国,而我所求职的部门老大也是前微软的资深工程师过来执掌的,意在说明公司人才实力。不过,目前公司的目标市场主要是国际市场,。。。。。。
2、作为实习生,在公司里我们的角色或职责是怎样的?
再分析一篇好的面经(源自牛客网)
【面经】阿里+百度+CVTE面经合集(offer均已收到)
一、CVTE
一面:
第一个是二分查找,我用递归和非递归各写了一遍,重点就在于下标的控制;另一道是在N个数中求前M大个数,其实也很简单,思路就是使用快速排序的思想,每一次当把一个数字放在正确的位置上的时候跟M进行比较,其实在剑指offer上有原题。好在寒假的时候把剑指offer刷了很多遍,所以很快也写出来了。我个人觉得在写代码之前,有很多事情需要跟面试官进行交流,比如函数的参数、返回值、还有一些异常情况的处理,提前跟面试官约定好。比如我在写代码之前,就问面试官:“假设参数是(int * a rr, int length, int m),在这种情况下,可能会有四种情况会导致程序出现异常情况,① arr == NULL ② length <= 0 ③ m > length ④ m <= 0,询问他在这四种情况下我们该如何处理?”面试官听完之后一下就有兴趣了,及时跟面试官沟通,一方面是防止思路与面试官预期的差距太大,面试官出的题,因此他有责任让面试者明白他的意思,另一方面表现我们积极思考,向面试官展示我们的思考能力。可能之前的算法写的太顺利,所以给自己建立了自信,并且面试官对我的第一印象也好,后面的问题回答的很轻松,有struts2和SpringMVC的区别、Spring中IoC和AOP的理解,不过在数据库方面被难住了,在MySQL中如何定为查询效率较慢的SQL语句,比如慢查询日志、EXPLAIN关键字还有PROFILES等。但是总得来说,一面进行的很顺利。
二面:CVTE的面试流程是,如果一面的面试官觉得通过了,就会示意现场接待的姐姐,姐姐会安排在场外休息一下,二面大概在十分钟之后进行;而如果觉得不符合要求,姐姐就会亲切地告诉面试者,今天的面试结束了,可以先回去等消息。等了十分钟之后,二面如约而至,二面是一个年纪稍大,但是很有风度的中年人,事后学长说那是他们部门的BOSS,面试官让我设计了一个场景,青蛙爬井, 就是画画UML,两个类图,和他们的关系。最后扩展成面向接口的思维,不得不说BOSS确实功力深厚,纠正了我很多问题,最后才勉强满意。然后就是 分析项目,挑了一个我比较熟悉的,问了很多问题,比如页面的跳转关系、我所做的功能模块,让我一边画图一边解释,我自认项目准备的还算充分,因为都是自己做的,所以这部分也算顺利。后面就没有什么技术问题,问了一下我什么时候能来实习,还有在校的经历,同学之间是如何评价我的,然后就结束了。
HR面:那个问卷问的很全面,比如家庭状况、为什么选择去广州、什么情况下会放弃这份工作、小时候印象最深的一件事情、列举出近期让你伤心的事情以及你是如何处理不良情绪的。如果各位到了这一步,一定要谨慎作答,这些问题都会列入到综合评测中。后面的面试就是把这些问题现场问一遍,说是HR面,但我总感觉是高管面,一个高管面三个面试者。
面试出来之后,等做到地铁上,广州负责的CVTE校招的学长就已经告诉我通过了,效率非常高。3月26号拿到的offer,这是春招的第一个offer,当时的心情还是很激动的。
二、百度
百度是学长内推,技术面是两轮技术面试。
一面:简单的自我介绍,因为是电话面试,所以流畅了很多(你们懂的)。一个小时满满的技术问题,所以就不用向上面再赘述了,直接上干货
1. 是否了解动态规划
动归,本质上是一种划分子问题的算法,站在任何一个子问题的处理上看,当前子问题的提出都要依据现有的类似结论,而当前问题的结论是后 面问题求解的铺垫。任何DP都是基于存储的算法,核心是状态转移方程。
2. JVM调优
其实我没有实际的调优经验,但是我主要介绍了一下JVM的分区、堆的分代以及回收算法还有OOM异常的处理思路
3. 分别介绍一下Struts2和Spring
不用多说,这方面比我答得好的同学肯定大有人在,就不出丑了
4. 职责链模式(设计模式)
GoF经典设计模式的一种
5. 实践中如何优化MySQL
我当时是按以下四条依次回答的,他们四条从效果上第一条影响最大,后面越来越小。
① SQL语句及索引的优化
② 数据库表结构的优化
③ 系统配置的优化
④ 硬件的优化
6. 什么情况下设置了索引但无法使用
(1) 以“%”开头的LIKE语句,模糊匹配
(2)OR语句前后没有同时使用索引
(3)数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
(4)WHERE字句的查询条件里有不等于号(如:WHERE column!=...)
(5)查询的列不是独立的,如:索引是表达式的一部分,或者是函数的参数
(6)当索引是复合索引,却并没有用到该索引中的第一个字段作为条件时
->可以测试如下:(也可参考: 哪些情况下索引会失效)
此外,查看索引的使用情况
show status like ‘Handler_read%’;
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效
7. SQL语句的优化
order by要怎么处理
alter尽量将多次合并为一次
insert和delete也需要合并
等等
可参考: 30种mysql优化sql语句查询的方法
8. 索引的底层实现原理和优化
B+树,经过优化的B+树
主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。
可参考: MySQL索引背后的数据结构及算法原理
由浅入深理解数据库中索引的底层实现
9. HTTP和HTTPS的主要区别
区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
更详细的可参考:HTTP与HTTPS的区别
10. Cookie和Session的区别
前面已整理过,也可参考(HTTP协议详解)里的相关部分。
11. 如何设计一个高并发的系统
① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化
② 使用缓存,尽量减少数据库 IO
③ 分布式数据库、分布式缓存
④ 服务器的负载均衡
12. linux中如何查看进程等命令
13. 两条相交的单向链表,如何求他们的第一个公共节点
很简单的链表题目,博客上的做法一搜一大把,我记得当时答在兴头上,又给面试官解释了一下如何求单向局部循环链表的入口,链表中很经典的问题(其实链表也就那几个常用算法,比如逆制、求倒数第K个节点,判断是否有环等)
大概八十分钟吧,最后问面试官有没有对我的意见或者建议,面试官说觉得我今晚的面试表现比简历上写的更出色。。。对面试官的好感度瞬间飙升
二面:可能一面面试官对我的评价还算不错,二面面试官一口气考了我11个设计模式(手动微笑),对,是11个设计模式,有直接提问,也有在场景设计中引导我使用。总共加起来11个,分别是:单例模式、简单工厂模式、工厂模式、抽象工厂模式、策略模式、观察者模式、组合模式、适配器模式、装饰模式、代理模式、外观模式。然后就是设计一个公司下有部门、部门下有经理和员工,经理可以管理经理和员工这样的一个模型,组合模式一套用就行了。后面还问了几个非技术问题,比如和产品、测试发生矛盾了怎么处理,答应的任务发现完成不了该如何处理等,大家如果遇到请随意装逼。
百度给我最大的印象就是每次新的面试,面试官一定会问什么时候能来实习,能够实习多长时间,答案符合要求了才进行下面的面试。据说百度今年要求6个月的实习时间,回答两三个月的都再无下文。
机智的我不管哪家公司问都是说从即日起到大四毕业,中间出了期末考试和毕业设计,都能参与实习,近期就能参加实习。不是故意想骗人,只是目前还没有和HR谈条件的筹码,这样说了就算最后去不了,也算是一次面试机会,如果一开始就拒绝的话,连面试机会都没有。等到技术面试结束了,跟一开始比,就有了谈条件的筹码,这个时候大家再根据情况合理要价
三、阿里巴巴
一面:
1. 二叉树的遍历方式,前序、中序、后序和层序
二叉树本身就是一个递归的产物,那前序举例,访问根节点,然后左节点,再右节点,如果左节点是一棵子树,那么就先访问左子树的根节点,再访问左子树的左节点,依次递归;而层序,使用队列进行辅助,实现广度优先搜索
2. volatile关键字
给大家推荐两本书:《Java多线程实战》和《Java并发编程的艺术》,这会儿已经三点了,脑子有点乱书名可能未必无误。对Java实现多线程描述的非常详细。现场跟面试官老师扯了很多,我在这里挑主要的说
volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障
作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)
但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。
3. synchronized
锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁
锁的膨胀模型,以及锁的优化原理,为什么要这样设计
与Concurrent包下的Lock的区别和联系
Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中
4. concurrentHashMap
两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。
而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。
5. 锁的优化策略
① 读写分离
② 分段加锁
③ 减少锁持有的时间
④ 多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久
6. 操作系统
这部分基本是跪着跟面试官交流的,因为非计算机专业,对这个楼主确实比较欠缺
不过好在前面的表现还可以,顺利通过了。
二面:十分钟休息,二面面试官先问了一些无关紧要的问题,比如学校的专业课、平时如何学习新技术等等,然后切入正题,让我选一个熟悉的项目,三分钟画出大体架构图,我在项目部分的准备还算充分,但是面试官真的水平非常高。
在项目部分,可能是我整个阿里面试过程中最提心吊胆的,缓存的使用,如果现在需要实现一个简单的缓存,供搜索框中的ajax异步请求调用,使用什么结构?我回答ConcurrentHashMap,可是内存中的缓存不能一直存在,用什么算法定期将搜索权重较低的entry去掉?我说先按热度递减放进一个CopyOnWriteArrayList中,保留前多少个然后再存回ConcurrentHashMap中,面试官说效率过低,有没有更高效的算法,我假装冥思苦想(用假装其实是因为,确实想不到方法)
后来面试官说其实这个问题有点难了,换一个,又跟我扯到线程的问题,大体就跟一面面试官问的差不多,就不赘述了。这部分感觉面试官还比较满意,就问题TCP如何保证安全性,我说三次握手、四次回收、超时重传、保序性、奇偶校验、去重、拥塞控制。还讲了滑动窗口模型。
后面又考了一些红黑树的问题,问到B+数,还有JDK1.8中对HashMap的增强,如果一个桶上的节点数量过多,链表+数组的结构就会转换为红黑树。
面试官问我项目中使用的单机服务器,如果将它部署成分布式服务器?我当时心里一惊,这个问题确实没有准备过,眼看就要被问死了,临时抖了个机灵,说有一次跟一个师兄尝试这么做的时候,遇到了session共享问题,然后成功地把面试官引向了session共享的问题,跟他讨论了10分钟左右的分布式系统中如何做到session共享。后面面试官可能也觉得我这部分
手写一个线程安全的单例模式,经典的不能再经典,没什么好说的,懒汉饿汉随便选一个。
还有一些MySQL的常见优化方式、定为慢查询等,回答的七七八八,之前面试总结的问题还有印象,所以感谢自己有面试完及时总结的习惯。
最后问了问我平时都如何学习、最近都在看什么书,来实习的话学校的考试如何解决等等。
面试官告诉我他的问题已经问完了,我看没有让我提问的意思,所以我起身跟面试官握了个手(我在参加现场面试的时候有这样的习惯,握手的同时跟面试官强调,“我很珍惜这次面试机会”)
二面出来之后挺紧张的,感觉自己答的还是有很多漏洞,可能面试官虽然发现了,但是觉得我态度不错,虚心学习,所以还是很幸运到了HR面,HR面就不多说了,只要不跟HR乱提要求,比如不考虑某某城市之类的作死要求,再跟HR好好谈谈我们对知识的渴望、希望得到锻炼的决心,我觉得都没什么问题(网易除外,都是泪)
我还重点给HR讲了一下我对项目的反思,哪些地方可以做的更好。又把一次学习新技术时间又很紧的尽力夸大了一下,HR听完之后表示非常羡慕我们这样搞技术的,感觉每天做的事情都很有激情。
最后就是经过三天的等待,顺利拿到阿里巴巴的实习offer
楼主从三月初到现在,基本能叫的出来的公司都参加了各种面试,很惭愧拿到offer的只有这三家。但是经过大大小小二三十次的面试,我觉得对一个后台程序员来说,重要的不只是语言,还有数据结构算法、网络基础、并发、数据库、设计模式、操作系统、linux等等很多很多技术需要掌握。我就有很强烈的感觉,单论Java,在楼主的周围其实有很多比楼主强得多的人,可是他们有的人面试一直不顺利,原因就在于其他的知识点相对薄弱。这点在阿里巴巴面试中就体现的很深刻。最后HR问我作为非计算机专业学生,什么专业课没有学到最让我遗憾?我回答网络基础、操作系统、计算机组成原理和系统的数据库知识体系。虽然侥幸拿到了阿里巴巴的offer,但这一次的面试让我深深地看到了自己差距。跟二面面试官交流的时候,他考我项目,我就拼命想把他往框架上拉,想解释hibernate和Spring还有mybatis,结果面试官一次也没有上当。每当我说这些的时候,面试官就会打断我,说我不用解释框架,我们就建立在这些东西都双方都清楚的基础上。所以真心劝各位准备面试的朋友们,多重视基础。基础能够决定学习能力和思维方式,而学习能力和思维方式最终决定一个程序员能走多远。