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的较量中胜出