zoukankan      html  css  js  c++  java
  • [No000097]程序员面试题集【下】

    1.下面中共包含()个正方形?40

    计算规律,设大长方形长是5,宽是4,小正方形边长是1,那么图中.小正方形的个数是,4*5个,边长是2的正方形的个数是3*4个,边长是3的正方形的个数是2*3个,边长是4的正方形的个数是1*2

    所以总共:4*5+3*4+2*3+1*2=20+12+6+2=40

    2. CLI:通用语言基础结构(Common Language InfrastructureCLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。(command-line interface,命令行界面)

    CLR:公共语言运行库(Common Language Runtime)Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。

    IL:MSIL(Microsoft Intermediate Language),是将.NET代码转化为机器语言的一个中间语言,因此又把IL语言称之为伪汇编语言。

    JIT:Just-in-time 即时编译

    GC:Garbage Collection,.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间(事实上何时清理内存是个复杂的策略)。可以在程序中显式地使用System.gc()/System.GC.Collect()来强制进行一次立即的内存清理。

    3. 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些结构?在自定义类型时,您如何选择是类还是结构?

    class是引用类型,struct是值类型;Struct有性能优势,Class有面向对象的扩展优势。

    class可以继承类、接口和被继承,struct只能继承接口,不能被继承;

    class有默认的无参构造函数,有析构函数,struct没有默认的无参构造函数,且只能声明有参的构造函数,没有析构函数;

    class可以使用abstractsealed,有protected修饰符,struct不可以用abstractsealed,没有protected修饰符;

    class必须使用new初始化,结构可以不用new初始化;当你实例化一个class,它将创建在堆上。而你实例化一个struct,它将创建在栈上

    class实例由垃圾回收机制来保证内存的回收处理,而struct变量使用完后立即自动解除内存分配;

    从职能观点来看,class表现为行为,而struct常用于存储数据;

    作为参数传递时,class变量以按址方式传递,而struct变量是以按值方式传递的。

    BCLBase Class Library)是Dot Net Framework下所有语言使用的类库,DateTime是一个结构体。

    struct 类型适于表示 PointRectangle Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个 1000 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。

    如何选择使用结构还是类:

    1).堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

    2).结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低

    3).在表现抽象和多级别的对象层次时,类是最好的选择

    4).大多数情况下该类型只是一些数据时,结构是最佳的选择

    4. 泛型的作用是什么?它有什么优势?它对性能有影响吗?它在执行时的行为是什么?.NET BCL中有哪些泛型类型?

    泛型的作用在于"算法的重用"。优势1.源代码保护。2.类型安全3.更清晰地代码。4.更好的性能,因为值类型可以避免装箱和拆箱所带来的损耗(垃圾回收的次数也会减少); 对性能有积极的影响,因为值类型可以避免装箱和拆箱所带来的负面影响,避免了垃圾回收,使得性能显著提高。但是对引用类型这种影响就不明显了;使用泛型类型参数的一个方法在进行JIT编译时,CLR获取IL,用指定的类型实参进行替换,然后创建本地代码。需要特别注意的是引用类型是共享代码的,而对值类型就会为每一种生成独立的一份类型代码;List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等

    5. 用扩展方法为c#中的string类型增加一个字符转换为数组的方法

    namespace 扩展方法

    {

    public static class String//扩展方法必须是静态的

    {

    public static char[] toCharArr(this string _input)//扩展方法必须是静态的,第一个参数必须加上this

    {

                char[] charA = new char[_input.len()];

                for(int i = 0 ;i<_input.len();i++)

                {

                    charA[i]=_input[i];

                }

    return charA;

    }

    public static string Quot(this string _input, string _quot)//带多个参数的扩展方法//在原始字符串前后加上指定的字符

    {

    return _quot + _input + _quot;

    }

    }

        class Program

    {

    static void Main(string[] args)

    {

    string _myString = "abc";//这里就可以直接使用string类的扩展方法IsEmail了

    Console.WriteLine(_myString.toCharArr());

    Console.WriteLine(_myString.Quot("!"));//调用接收参数的扩展方法

    Console.ReadLine();

    }

    }

    }

    6简述数组,链表,哈希(HASH)各自特点

    数组:通过从0开始的索引,可以顺序存取/查找或者随机存取/查找,而链表只能顺序存取/查找;

    链表:一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。它通过每个结点中的下一个结点的地址的指针域来查找定位

    哈希:根据关键码值(Key value)而直接进行访问的数据结构。

    7. 简述一下C#中的Invoke和BeginInvoke的意思,并简述它们的使用场景

    多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

    通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

    Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。

    Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托。

    Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行

    8. C#中的委托是什么?事件是不是一种委托?

    委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。(类似于C语言中的函数指针,可以把一个方法名作为参数代入另一个方法。);事件是一种特殊的委托,对于事件来讲,外部只能"注册自己+=、注销自己-=",外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。

    9.接口和抽象类有什么区别,选择的依据是什么?

    抽象类里面可以有非抽象方法但接口里只能有抽象方法,一个类一次可以实现若干个接口,但是只能扩展一个父类;接口是对动作的抽象,抽象类是对根源的抽象。

    10. mvc是什么

    MVC(模型Model-视图View-控制器Controller)是一种设计模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

    11. IOC是什么?有哪些IOC框架

    Inversion of Control,即反转控制,或许说为依赖注入更为合适。是一种设计模式。

    12. 简述 private protected public internal 修饰符的访问权限。

    private : 私有成员, 在类的内部才可以访问。

    protected : 保护成员,该类内部和继承类中可以访问。

    public : 公共成员,完全公开,没有访问限制。

    internal: 在同一命名空间内可以访问。

    13. 页面之间值传递常用的几种方式

    1.QuerySting在页面间传递值

    2.Session变量

    3.Cookie对象变量

    4.使用Application 对象变量

    14. c#constreadonly区别

    const 的概念就是一个包含不能修改的值的变量。readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。

    1. const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。

    2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。

    3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。

    4const 对于引用类型的常数,可能的值只能是 string nullreadonly可以是任何类型

    总结,const只能在初期就使用常量初始化好。对于每一次编译后的结果,const的值是固定的,而readonly的值是可以在运行的时候才确定值的。

    15. public void test(object ii) {

        lock(this){

         if (i>10){

             i--;

             test(i);

         }

        }

    },简述死锁的理由:

    你在test中lock了,这时代码走到test(i);还是调用test,到lock(this) 是发现已经锁住了 ,所以就等待

    16. 简述一下GC算法,微软提供的比较好的对象释放方式是什么,.net可以用析构函数吗?

    既然GC负责垃圾回收,所有的算法无外乎都做两件事:(1)找到所有不再使用的对象。(2)回收这些对象的空间。

    如:1. 引用计数器;2. 遍历搜索器;3. 碎片整理器;4. 分代收集算法;

    2.Dispose 方法(实现 IDisposable 接口);using 语句;try、catch 和 finally 块

    3.可以

    17. 迭代器的好处(yield)

    yield关键字在迭代器中,用于向枚举对象返回元素值或发出迭代结束信号。

    迭代器能够在类或结构中支持foreach迭代,而不必实现IEnumerable接口。

    创建迭代器最常用的方法是对IEnumerable接口实现GetEnumerator方法。

    18. C#中的特性(Attribute)用途,好处,弊端

    Attribute:一个类,公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。

    19. string是值类型还是引用类型?string str1 = str2 ="12345";str1 = "abc"; str2=?

    String是一种特殊的引用类型,str2="12345",str1的改变不会影响str2

    20. C#构造函数关键字是private,确通过一个public方法内部new了一个实例

    public class Singlton

    {

        private static Singleton _Instance;

        provate static readonly object syslocker = new object();

        //私有化构造函数

        private Sinalton()

        {

        }

        public static Singlton GetInstance()

        {

            if(_Instance == null)

            {

                lock(syslocker)

                {

                    if(_Instance == null)

                    {

                        _Instance = new Singlton();

                    }

                }

            }

            return _Instance;

        }

    }

    使用private将构造私有化,然后通过GetInstance()方法获得实例。这样能保存生成的实例是单一的。不允许用户使用构造函数重新构造。

    21. 数据库索引类型有哪些?

    Single column 单行索引

    Concatenated 多行索引

    Unique 唯一索引

    NonUnique 非唯一索引

    Function-based函数索引

    Domain 域索引

    物理上:

    Partitioned 分区索引

    NonPartitioned 非分区索引

    B-tree:

    Normal 正常型B树

    Rever Key 反转型B树

    Bitmap 位图索引

    索引结构:

    B-tree:适合与大量的增、删、改(OLTP);

    不能用包含OR操作符的查询;

    适合高基数的列(唯一值多)

    典型的树状结构;

    每个结点都是数据块;

    大多都是物理上一层、两层或三层不定,逻辑上三层;

    叶子块数据是排序的,从左向右递增;

    在分支块和根块中放的是索引的范围;

    Bitmap:

    适合与决策支持系统;

    做UPDATE代价非常高;

    非常适合OR操作符的查询;

    基数比较少的时候才能建位图索引;

    树型结构:索引头

    开始ROWID,结束ROWID(先列出索引的最大范围)

    22. NoSQL是什么,优点?

    NoSQL(Not Only SQL),泛指非关系型的数据库。四大分类:键值(Key-Value)存储数据库;列存储数据库;文档型数据库;图形(Graph)数据库;

    弹性可扩展,异步复制,可以处理超大量的数据

    23.求斐波那契数列(递归算法)

    Public static long F(int n){if(n==1||n==2)return (1L);else return F(n-2)+F(n-1);} //main中计算F(30);

    24.猫叫,老鼠跑,主人醒事件

    public class Cat// 猫类,发布者

    {

        private string _name;

        public event EventHandler<CatCryEventArgs> CatCryEvent;//猫叫事件

        public Cat(string name)// 构造函数

        {_name = name;}

        public void CatCry()/// 触发事件

        {

            CatCryEventArgs args =new CatCryEventArgs(_name);

            Console.WriteLine(_name +" 叫");//猫叫

            CatCryEvent(this,args);

        }

    }

    public class CatCryEventArgs:EventArgs// 猫叫事件参数,委托

    {

        privatestring _catname;

        public CatCryEventArgs(string catname):base()

        {_catname = catname;}

    }

    public class Mouse //老鼠类,订阅者

    {

        private string _name;

        public Mouse(string name,Cat cat)

        {

            _name = name;

            cat.CatCryEvent += CatCryHandle;//订阅猫叫事件

        }

        private void CatCryHandle(object sender,CatCryEventArgs args)// 猫叫事件处理

        {

            Console.WriteLine(_name +"跑");//老鼠跑

        }

    }

    public class Master//主人类,订阅者

    {

        private string _name;

        public Master(string name,Cat cat)// 构造函数,订阅事件

        {

        _name = name;

        cat.CatCryEvent += CatCryHandler;//订阅猫叫事件

        }

        private void CatCryHandler(object sender,CatCryEventArgs args)// 猫叫事件处理

        {

        Console.WriteLine(_name+" 醒") ;

        }

    }

    Cat cat =new Cat("cat");//主函数调用

    Mouse mouse =new Mouse("mouse", cat);

    Master master =new Master("master", cat);

    cat.CatCry();

  • 相关阅读:
    android29
    android28
    android27
    android26
    Dynamics CRM2011 MspInstallAction failed when installing an Update Rollup
    Dynamics CRM Import Solution Attribute Display Name description is null or empty
    The service cannot be activated because it does not support ASP.NET compatibility
    IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
    Unable to access the IIS metabase.You do not have sufficient privilege
    LM算法与非线性最小二乘问题
  • 原文地址:https://www.cnblogs.com/Chary/p/No000097.html
Copyright © 2011-2022 走看看