一.非技术题
1.有7个球。大小相同。仅有一个重量不同。给你一个平称,最快速度找到重量不一样的那一颗;
(1)先拿出其中6个球,平均分放到天平两端。
(2)如果天平平衡,则剩下不同。
(3)如果天平不平衡,则选重的那边任意两个球做比较。
(4)如果一样重,则剩下的那个求就是不一样的,如果天平不平衡,从之前那三颗选出一颗与其中一颗比较,一样则是另一颗,不一样则是比较的这颗。
二、技术题
1.下列关于构造函数的描述正确的是(C);
A、构造函数可以声明返回类型;
B、构造函数不可以有private修饰;
C、构造函数通常与类名相同;
D、构造函数不能带参数;
2.下列关于C#索引器理解正确的是( C);
A、索引器的参数必须是2个或2个以上;
B、索引器的参数必须是整数型;
C、索引器没有名字;
D、以上皆非;
索引至少声明1个参数,A错;索引参数类型不必是整型, B错;索引确实没有名字,名字位置上都是关键字this,C对。
3.委托可以把( C)递给( C);
A、对象和对象;
B、对象和方法;
C、方法和方法;
4.以下哪个是排序的数据列表:(A );
A、SortedList B、HashTable
C、ArryList D、Heap
5.关于线程和进程的说法( C);
A、操作系统中的每一个应用程序必须由一个进程,但不必有线程;
B、一个进程可以有自己的堆栈,但是线程只能和进程共享堆栈;
C、线程必隶属于一个进程;
D、线程可以改变它属于哪个进程;
二、简答题
1.C#的类和接口有什么异同?
是继承与被继承的关系,类可以继承接口,实现接口所有的方法。接口只是定义方法的返回值什么的,而继承类则负责实现接口的方法,就这么个关系;
抽象类:
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
接口:
接口是引用类型的,类似于类,更和抽象类有所相似,以至于很多人对抽象类和接口的区别比较模糊。和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。 其实java的接口和抽象类跟C#是差不多的, 他们的特性是相同!别的就是语法的不同了!
2.C#访问修饰符有哪些,分别有什么作用?
public 公共的,可任意访问
private 私有的,可被本类访问
protected保护,可被本类和子类访问
internal 内部,可被本程序集内的所有类访问
protected internal内部保护,只能被本程序集内的所有类和这些类的继承子类所存取
3.C#中类可以实现多继承吗?通过什么方式实现?
C#中类不支持多继承,但是允许类和接口之间实现多继承
所以第一个方法,一个一个派生
第二个方法,利用接口,实现多继承
4.什么是反射?
JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。
5.一数列的规则如下:0、1、1、1、2、3、4、6、9....求第30位数是多少,用递归算法实现;
0,1,2,3,4,9,6,27,这些数字有什么规律
分成2组观察
0,2,4,6,8,10......
依次的双数
1,3,9,27,81,243.....
后一个数是前一个数的三倍
6.C#可否对内存进行直接操作?
可以的,
c#中是有指针的,虽然很少用到,虽然使用时要加上"unsafe"
只针对这个问题,c#是可以的
可是使用时要加上"unsafe",这已经是他从c++过来的一个转变了,......
7.简述MVC及其优缺点?
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
优点:
1:耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2:重用性高
随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
MVC使开发和维护用户接口的技术含量降低。
3:部署快
使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
4:可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
5:有利软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
缺点:
1:没有明确的定义
完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
2:不适合小型,中等规模的应用程序
花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
3:增加系统结构和实现的复杂性
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
4:视图与控制器间的过于紧密的连接
视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
5:视图对模型数据的低效率访问
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
6:一般高级的界面工具或构造器不支持模式
改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。
8.C#中委托是什么,事件是不是一种委托。
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
9.a=10,b=15,在不适用第三方变量的前提下,把a、b的值互换。
a=a+b;
b=a-b;
a=a-b;
10.hashMap的数据结构;
在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
11.Redis可缓存哪几种数据类型;
String类型、List类型、Set类型(不可重复的无序集合)、ZSet(不可重复的有序集合)、Hash(键值对集合)
12.集合怎么扩容;怎么不使用新集合的情况下去重;
ArrayList 默认初始容量为10
线程不安全,查询速度快
底层数据结构是数组结构
扩容增量:原容量的 0.5倍
如 ArrayList的容量为10,一次扩容后是容量为15
同样可以通过分析源码知道:
Vector:线程安全,但速度慢
底层数据结构是数组结构
加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
扩容增量:原容量的 1倍
如 Vector的容量为10,一次扩容后是容量为20
Set(集) 元素无序的、不可重复。
HashSet:线程不安全,存取速度快
底层实现是一个HashMap(保存数据),实现Set接口
默认初始容量为16(为何是16,见下方对HashMap的描述)
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
扩容增量:原容量的 1 倍
如 HashSet的容量为16,一次扩容后是容量为32
for(int x =0;x<a.size()-1;x++){
for(int y=(x+1);y<a.size();y++){
if(a.get(x).equals(a.get(y))){
a.remove(y); y--;//这里很重要 在内循环中如果删掉一个元素 下一个元素会补位到被删除的位置 但是内循环y依旧是跳到下一个位置去了,所以补位的元素就没有判断 而跳过去了!每次 删除一个元素后 要把y退回到上一个位置!
}
}
}
System.out.println(a);