C#高级二

编程小虾米大侠之梦 软件环境:win7 开发工具:vs 2010 平台:.NET 语言:C# 类库版本:.NET Framework 2.0 语言特点:强类型语言

规划知识点: 1、.net framework结构图    CLR:公共语言规范,MSIL:计算机中间语言    F5 → 开发工具编译(基类库、公共语言进行时) → MSIL → cpu(二进制) → MSIL →    操作系统 → 效果

2、命名空间:namespace    使用:using    命名控件存在嵌套,.可以嵌套访问下一级的命名空间 例如using system.collections.giney;

3、变量:访问修饰符    数据类型    标识符($_a-z) =  值           public        int         a            = 1;           a = 100;           private       string      _a           = "a"    protected     bool        a1           = true / false       internal                  1a(X)        = X    常量:const public int abc =100;

4、基本数据类型:值类型        引用类型               存储到栈        放到内存堆               存储的值        存储的值对应的地址               存储快空间大     读取慢,空间小

5、装箱:值类型转换成引用类型    拆箱:引用类型转换为值类型

6、逻辑语句块:    if(条件){执行结果}else {执行结果}    if(T) {JG} else if(T) .....else{}    if(T) {} if(T) {} ......    switch(T){ case 1: jg1 break; case 2: jg2 break;.....default: jg break;}

7、循环结构    while(条件){循环体}    do{循环体} while(条件);    for(初始化变量;条件;增量){循环体}  //循环 根据循环条件    foreach(最小单位变为 变量名 in 集合或数组){循环体} //遍历 所有都拿出来

8、数组(三种定义方式) :数据类型 [] 数组名 ;    int [] num1 = new int[5];   num1[0] = 100;    int a = num1[0];    int [] num2 = {1,4,3,6,8,9};  同上    int [] num3 = new int[5]{3,5,7,98,3,0};  同上

9、结构:    访问修饰符  struct 机构名{ 属性、行为}    例: public  struct abc{ public int a ; public void meth(){}}

10、枚举:    访问修饰符 enum 枚举名 { 值列表}    利:public enum en { 100,200,300}    en.100;

11、OOP :面向对象的编程    对象:万物皆对象    类:属性和行为封装起来的    关系:类是对象的具体实现, 对象是类的抽象描述    OOP特质:封装、继承、多态

12、构造函数和析构函数    构造作用:初始化对象 方法名与类名相同 ,没有返回类型        概念:重载(方法名相同参数列表不同【一个类中】)        例:public void a(){} ,  public void a(int b){}    析构作用:销毁对象

13、方法    定义  访问修饰符  返回类型 方法名(参数列表){方法体}    例:  private int  meth(int a ,int b){return a + b;}          public string meth2(string a ,string b){ return "111";}          public void meth3(){}    调用:同类中,,,直接方法名(参数);          不同类,,,实例化所在类 new  类名.方法名(参数);

14、封装:    概念:把尽可能多的封装起来,把所有属性封装     特点:安全性高,把属性隐藏    语法:private string age;          public string Age          {              get { return age; }              set { age = value; }          }

15、继承     方式:隐式继承、显示继承             :        base(继承父类中构造函数)     语法:子类:父类 (继承父类中的所有非私有成员)     特性:传递、单根、重用

16、重写、new隐藏     重写:override (重写、虚方法virtual ,抽象方法abstract ,已被重写过的方法)     new :三种用法           1》实例化类   类名  名 = new 类名();    2》申请数据或集合:  int [] a = new int[5];      3》隐藏继承成员  :  a:b b.meth();   a→ new public void meth(){}

17、抽象类 、抽象方法  abstract     语法:abstract class  名{}     定义:不能被实例化,必须有普通类继承并实现 ,包含抽象方法,可以包含普通方法           抽象方法必须写到抽象类中     应用:非真是对象,在程序中描述虚拟或构想出来的对象,

18、接口:interface     语法:interface I名 {}     定义:不能有访问修饰符,不能有方法体           只能由普通类继承并实现  ,,接口允许多继承

19、接口、抽象类异同     接口与抽象类的区别:                     抽象类                        接口   用abstract定义               用interface定义                 只能继承一个类               可以实现多个接口   非抽象派生类必须实现抽象方法          实现接口的类必须实现所有成员 不同点     需要override实现抽象方法                   直接实现

   不能被实例化 相同点  包含为实现的方法  派生类(子类)必须实现未实现的方法

  =======================================================================================

[Array和ArrayList的区别]: #1.Array的用法与数组几乎一样,可以看做是数组。在定义的时候需要指定长度;ArrayList的用法与普通集合一样,定义的时候不需要指定长度;

#2. Array只能存储同构的对象,而ArrayList可以存储异构的对象。 同构的对象是指类型相同的对象,若声明为int[]的数组就只能存放整形数据,string[]只能存放字符型数据,但声明为object[]的数组除外。 而ArrayList可以存放任何不同类型的数据(因为它里面存放的都是被装箱了的Object型对象,实际上ArrayList内部就是使用"object[] _items;"这样一个私有字段来封装对象的)

#3 在CLR托管对中的存放方式 Array是始终是连续存放的,而ArrayList的存放不一定连续。

#4 初始化大小 Array对象的初始化必须只定指定大小,且创建后的数组大小是固定的, 而ArrayList的大小可以动态指定,其大小可以在初始化时指定,也可以不指定,也就是说该对象的空间可以任意增加。

#5 Array不能够随意添加和删除其中的项,而ArrayList可以在任意位置插入和删除项。

[Array和ArrayList的相似点]

#1 都具有索引(index),即可以通过index来直接获取和修改任意项。 #2 他们所创建的对象都放在托管堆中。 #3 都能够对自身进行枚举(因为都实现了IEnumerable接口)。 ============================================================================== hashtable与Arraylist的区别: hash键值映射,简单说键对应值,我们认给每值都起名字,键所谓名字,我们通过名字来寻找值,而arraylist集合,线性结构存储数据,集合存储内容都值,并且我们给每值用索引做编号,所遍历过程我们用索引,arraylist有序,而hash无序

============================================================================== 在面试的时候,如果面试官问道集合,这两个大师绝对是少不了的,当然这个也是看你对基础的掌握是否透彻

一:选手介绍:

面试官让你说说他们二者的区别其实就是让你介绍一把而已

1:Hashtable继承自Dictionary类,而HashMap是Map接口的一个实现。这里要说明一下Dictionary类是jdk1.0中就有的,而Map接口是1.2之后才有的,当然与此同时Hashtable也实现了Map接口。

2:最重要的区别:Hashtable是线程安全的,而HashMap是线程不安全的。也就是说当我们的应用处于多个线程访问时,Hashtable是安全的,而HashMap要实现同步则要通过额外的同步机制:一般Collections的一个静态方法得到解决:Map m = Collections.synchronizedMap(new HashMap(...));这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

3:HashMap可以用null做为键(当然只能有一个),还可以有多个null的值,而Hashtable不可以存在null的键值。

当需要判断是否存在某个键映射一个值时:HashMap去掉了Hashtable的contains(Object value)方法,保留了containsValue(Object value)和containsKey(Object key)方法,因为contains和containsValue方法确实太像。

注:

get(Object key) 返回与指定键关联的值;

containsKey(Object key) 如果Map包含指定键的隐射,则返回true;

containsValue(Object value) 如果Map将一个或多个键隐射到指定值,则返回true;

isEmpty()如果Map不包含键-值隐射,则返回true;

二:优缺点比较:

这个说透彻很重要

Hashtable与hashmap 比较

1:效率:由于Hashtabe是线程安全的,当大量的并发访问的时候,速度肯定要比HashMap慢的多,当然这个的前提是:我们的程序不需要保证线程安全(同步)。

也就是说在不需要保证线程同步的情况下:我们应该选择Hashmap。

    大多数的应用是需要保证线程安全的:这个时候好像Hashtable先天有优势,但HashMap使用上面(区别:2)的方法一样可以保证线程安全,在这种情况下天才和后天努力者的对决好像势均力敌,难分高下,两者都可以选择。

2:空间:Hashtable的初始容量为11,而HashMap初始化容量为16.并且他们的加载因子默认都为0.75。前者的增加方式是 old*2+1;后者为old*2;也就是说当Hashtable中存在8个键值时,它的容量会自动增加到23.而HashMap中存在12个键值时,它会增加容量到32。

这样看来,一个是基数小增加快,一个是基数大增加慢。两者都可以选择。

3:官方建议:Sun的jdk不断更新,很多的类与方法不断的被重写和淘汰,显然后生的要比早生的先进,所以java官方还是支持HashMap的。像Dictionary也早已注明“已过时,建议使用Map接口”。当然Hashtable线程同步的优点还是比较突出的(例如属性文件),觉类似于HashMap的一个子类。

三:最后建议:

最后给出自己的结论

HashMap在与Hashtable的较量中胜出

原文地址:https://www.cnblogs.com/yuhangwang/p/4574454.html