一次失败的面试
做任何毫不费力的事情,都是在浪费时间,忘记这是哪本书里看到的了,到了30岁的年纪,越来越有感触,记录失败的面试,顺便祭奠一下被我挥霍掉的这5年。
前提:
公司从事的行业就不透露了,主要从事一些内部项目,如流程管理,原素材管理等。项目很多,但都不是很大,工作压力不是很大,只要多了解业务,思路清晰,很多工作都是轻轻松松的完成,即使偷懒,也被认为是骨干,并做到了pm的职位,还为自己可以号称全栈而沾沾自喜(确实全栈,甚至包括光纤部署,存储网络等都是自己来干)。而富裕的时间就是给互联网贡献流量了。突然,一觉醒来,发现自己已经三十岁了,有一个需要富养的千金,决定不能这样在荒废下去,不能在做这种轻松的小项目。于是开始了求职之路。
求职过程:
到某做在线教育的互联网公司面试工程师的职位。做了一份笔试题后(很多错误),和hr聊了聊,然后,就没有然后了。
面试题内容:
既然决定了,就要总结一下,回家后凭借记忆力把面试题大概的重写了一下,好多题目可能和原题不一致,毕竟是面试,不是参加最强大脑:
1 public,protected,private,internal,protected internal 这些限定符中,哪些可以被类使用,那些可以被方法是用
说实话,第一题就蒙了。这个还真不是很清楚!直接msdn的答案:
访问修饰符 |
说明 |
public |
公有访问。不受任何限制。 |
private |
私有访问。只限于本类成员访问,子类,实例都不能访问。 |
protected |
保护访问。只限于本类和子类访问,实例不能访问。 |
internal |
内部访问。只限于本项目内访问,其他不能访问。 |
protected internal |
内部保护访问。只限于本项目或是子类访问,其他不能访问 |
C# 方法默认访问级别: private
C# 类默认访问级别: internal
1 派生类的可访问性不能高于其基类型。换句话说,不能有从内部类A 派生的公共类B。如果允许这种情况,将会使A 成为公共类,因为A 的所有受保护的成员或内部成员都可以从派生类访问。
2 成员的可访问性决不能高于其包含类型的可访问性。
3 可以使用五种访问类型中的任何一种来声明类成员(包括嵌套的类和结构)。
即这些限定符类和方法均可以使用,但方法的可访问性不能高于其包含类的可访问性。
2 overload和override的区别
白送分的题:
1 override发生在继承中,两个函数的函数特征相同
2 overload的函数名虽然相同,但函数特征不同。
注:函数特征包括函数名,参数类型和参数个数。
3 String和StringBuilder 的区别
白送分题
1 string为System.String类 StringBuilder为System.Text.StringBuilder类
2 string不可变,修改后会创建一个新的string;StringBuilder 为可变的,当对变化比较频繁的时候,StringBuilder效率会高
4 以下程序共发生了几次装箱操作,有什么可以优化的方式
int v = 2; Console.WriteLine("v={0},v={1},v={2}", v,v,v); Console.ReadKey();
较简单
三次 优化方式为
int v = 2; Console.WriteLine("v={0},v={0},v={0}", v); Console.ReadKey();
5 程序阅读题
写出下列程序输出结果:
static void Main(string[] args) { string test = "hello"; test = test.ToUpper(); test = test.Insert(0, " WORLD"); Console.WriteLine(test); Console.ReadKey(); }
较简单 _WORLDHELLO(_表示空格)
6 程序阅读题
写出下列程序输出结果:
class A { public A() { OutputText(); } public virtual void OutputText() { Console.WriteLine("Hello world"); } } class B:A { int x = 0; int y; public B() { y = 1; } public override void OutputText() { Console.WriteLine("x+y={0}", x + y); } }
当时毫不犹豫的就写了 无输出!
实际上 子类会默认调用父类的无参数构造函数!!!
7 写程序题
具体题干忘记了 意思就是写出2+3+…55的值
典型的考递归的题
private static int MyAdd(int x,int y) { int sum=y; if (x <= 55) { Console.Write("+{0}", x); sum += x; return MyAdd(y, x + y); } else { Console.Write("={0}", sum); return sum; } }
8 写一个单例模式样例
这个题写了一个最简单的:
public sealed class Single { private static Single _instance = null; private Single () { } public static Single Instance { get { return _instance ?? (_instance = new Singleton()); } } }
9数据库题 写出SQL的几种连接方式
较简单
4种 内连接(左右) 外连接(左右)
10 数据库题 写一条SQL语句,查询主单表下的name字段是否有重复及重复次数
这个 简单理解为 应该是group by?
select count(name),name from 表1 group by name;
11 事物题 什么是事物的ACID属性
平时做的项目 确实很少用到事物,所以 事物题全军覆灭。
1. 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
2. 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
3. 隔离性(insulation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
4. 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。
12 由低到高写出事物的隔离级别
1 读未提交(Read uncommitted): 可以读取其他事务未提交的数据
2 读已提交(Read committed):只能读取其他事务已经提交的数据(有进行修改的)
3 可重复读(Repeatable read):保证使用该隔离级别的事务,在读取数据时的数据保持一致,不会被别的事务修改、删除数据(因为别的事务如果有修改、删除操作会被阻塞)
4 可串行化(Serializable):使用该隔离级别的事务用到的表将全部锁定,其他事务不可以进行添加、修改、删除
13 什么事幻影数据
幻影数据即不可重复读数据,指指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。具体有三种情况:
1 事务T1读取某一数据后,事务T2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。
2 事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神密地消失了。
3 事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
14 js题:
var obj=(function(){ var num=2; var output=function() { var num; alert(num); //1 num=2 alert(num);//2 } return {output:output}; })(); obj.output();
求两个alert的值
1 undefined
2 2
这道题,不知道为啥我鬼使神差的1写了null!
15 js题 setTimeout与setinterval区别
setTimeout() : 用于在指定的毫秒数后调用函数或计算表达式;
setInterval() : 按照指定的周期(以毫秒计)来调用函数或计算表达式. 会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭;
摘自js手册
简单说 setTime只执行了一个句柄,而setInterval循环执行。
写在后边:
常理来说,应该有16道题吧,但能想到的只有15道了
不管怎么说,这次面试铩羽而归。只能巩固现在,期待未来了