一:c语言指针数组和数组指针:

 

数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

 

优先级:()>[]>*

二:各种数据库对比

 

mssql : 是微软的 sql server ,只能能运行在windows平台,体积比较庞大,占用许多系统资源,

        但使用很方便,支持命令和图形化管理,主要结合asp语言开发;mssql是要钱的部门级数

 据库

mysql : 是个开源的数据库server,可运行在多种平台,如windows,unix/linux;他的体积很小

         是专为WEB 数据库设计的,特点是响应速度特别快,主要面向中小企业,对于海量数据库

  就显得力不从心了,它是真正的多用户多任务的数据库系统,他占用系统资源很少但功能

  很强大,可以作为大性数据库系统使用,最主要是其标准版是免费的。yahoo用的就是

  mysql;主要结合php语言开发。MySQL支持基本上是依靠网络和社区

PostgreSQL:号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能

            也很好


oracle  : 1.能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策

             略。可以使客户选择最适合的解决方案。对开发商全力支持。

           2.获得最高认证级别的ISO标准安全认证

    3.性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。

    4.多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接

    5.较复杂,同时提供GUI和命令行,在windowsNT和unix下操作相同

    6.长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险

db2 : 1. 能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,

          在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%。

 

       2. 具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一

          部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点或数据库节点

       3. 性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。

       4. 性能较高适用于数据仓库和在线事物处理。

       5. 跨平台,多层结构,支持ODBC,JDBC等客户

       6. 操作简单,同时提供GUI和命令行,在windowsNT和unix下操作相同

       7. 在巨型企业得到广泛的应用,向下兼容性好。风险小

Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。Microsoft Access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃,表现为英文 “Service Unavailable”。


MS SQL Server是基于服务器端的中型的数据库,可以适合大容量数据的应用,在功能上管理上也要比Microsoft Access要强得多。在处理海量数据的效率,后台开发的灵活性,可扩展性等方面强大。因为现在数据库都使用标准的SQL语言对数据库进行管理,所以如果 是标准SQL语言,两者基本上都可以通用的。Microsoft SQL Server还有更多的扩展,可以用存储过程,数据库大小无极限限制。

    MySql短小精悍,象access一样的文件型数据库,但比access强百倍,是真正多用户多任务的数据库系统,从Linux上移植过来的,安全性非 常好,不过大部分操作是在dos下进行,虽然也有第三方开发的图形界面但并不好用。MySQL是跨多平台的数据库管理软件,可运行于LINUX、NT、 UNIX等系统,可支持命令和图形化管理,对于一般的数据库足以应付了,占用系统资源较少,速度较快,而且是开源的。

    Oracle各方面都比较成熟,但对硬件要求高,用于数据完整性、安全性要求较高的场合,能在所有主流平台上运行,完全支持所有的工业标准,采用完全开放 策略。可以使客户选择最适合的解决方案,对开发商全力支持。平行服务器通过使一组结点共享同一簇中的工作来扩展服务器的能力,提供高可用性和高伸缩性的簇 的解决方案,获得最高认证级别的iso标准认证,多层次网络计算,支持多种工业标准,可以用odbc,jdbc,oci等网络客户连接,较复杂,同时提供 gui和命令行,在windows和unix下操作相同,如果windows不能满足需要,用户可以把数据库移到unix中。其操作和设置比较复杂,适用 于有一定操作经验的用户。

 

SQL Server数据库的特征及其与Access数据库的区别

 

三:final、static使用

http://iinnff.com/fR/brs/Part2/QID147/Page96207.aspx

四:字符串翻转

http://blog.csdn.net/yangfeitarena/archive/2009/04/12/4066485.aspx

五:死锁

http://baike.baidu.com/view/121723.htm

六:TCP与UDP的区别以及三次握手协议

http://baike.baidu.com/view/32754.htm

 1,TCP协议面向连接,UDP协议面向非连接

 
  2,TCP协议传输速度慢,UDP协议传输速度快
 
  3,TCP协议保证数据顺序,UDP协议不保证
 
  4,TCP协议保证数据正确性,UDP协议可能丢包
 
  5,TCP协议对系统资源要求多,UDP协议要求少

 

tcp的三次握手协议

http://baike.baidu.com/view/2494361.htm

七:sql语句,count的用法

http://www.w3school.com.cn/sql/sql_func_count.asp

八:设计模式:单实例模式,工厂模式,观察者模式

DP书籍

九:多线程编程:

http://lavasoft.blog.51cto.com/62575/27069/

十:session工作原理

http://www.cnblogs.com/kucongzhi/archive/2010/07/13/1776728.html

十一:基本类型与包装类型

基本数据类型包括byte、int、char、long、float、double、boolean和short。
引用数据类型包括:类,数组,接口

基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的。

由此,我们分析一下”==“和equals()的区别。

http://blog.csdn.net/xeon_pan/archive/2008/05/07/2408501.aspx

**由此分析一下栈与堆的区别:

 对象放在堆里,它的引用则是在栈里,基本类型都放在栈里,最简单的区别,栈快堆慢

 

stack 空间小,速度比较快, 用来放对象的引用
heep 大,一般所有创建的对象都放在这里。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享
int a = 3; 
int b = 3; 

  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。
http://blogold.chinaunix.net/u/16991/showart_131229.html 十二:collection和collections http://developer.51cto.com/art/200909/149543.htm 十三:

Connection,Statement,PreparedStatement,CallableStatement

http://blog.csdn.net/oswin_jiang/archive/2008/11/11/3274742.aspx


十四:java的常见异常

http://wenku.baidu.com/view/db232ce79b89680203d825bf.html


十五:switch语句的条件限制

http://lgf2006.spaces.live.com/blog/cns!B95B1CF24CB4D627!1636.entry

switch语句判断条件可以接受int、byte、char、short四种类型,不可以接受其他类型。

十六:java内部类

内部类是可以定义在另外一个类里面的类,内部类也成为嵌套类,内部类被定义在另一个类或一个语句甚至一个表达式中。在内部类中是不允许声明任何static成员的,只有顶层类可以声明,如果要在内部类中使用static成员,必须引用在顶层类中声明好的成员。

外部类可以调用静态内部类中静态成员和非静态成员,而静态内部类只能访问外部类的静态成员。

注:内部类不能与外部类同名

内部类的特征如下:

1:内部类可以被定义在方法中,他可以防卫外部类的final变量

2:内部类可以被定义为abstract抽象类

3:内部类可以被声明为private或protected

4:内部类可以作为一个借口,由另一个内部类来实现

5:内部类不能声明任何static成员

十七:遍历map最快的方法

http://www.shiningboys.cn/271.html

HashMap遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历 速度是有差别的。
第一种:

Map map = new HashMap();

Iterator iter = map.entrySet().iterator();

while (iter.hasNext()) {

Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey();

Object val = entry.getValue();

}

效率高,以后一定要使用此种方式!

第二种:

Map map = new HashMap();

Iterator iter = map.keySet().iterator();

while (iter.hasNext()) {

Object key = iter.next();

Object val = map.get(key);

}

效率低,以后尽量少使用!

HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:

public class HashMapTest {

public static void main(String[] args) …{

HashMap hashmap = new HashMap();

for (int i = 0; i <1000; i ) …{

hashmap.put(“” i, “thanks”);

}

long bs = Calendar.getInstance().getTimeInMillis();

Iterator iterator = hashmap.keySet().iterator();

while (iterator.hasNext()) …{

System.out.print(hashmap.get(iterator.next()));

}

System.out.println();

System.out.println(Calendar.getInstance().getTimeInMillis() – bs);

listHashMap();

}

public static void listHashMap() …{

java.util.HashMap hashmap = new java.util.HashMap();

for (int i = 0; i <1000; i ) …{

hashmap.put(“” i, “thanks”);

}

long bs = Calendar.getInstance().getTimeInMillis();

java.util.Iterator it = hashmap.entrySet().iterator();

while (it.hasNext()) …{

java.util.Map.Entry entry = (java.util.Map.Entry) it.next();

// entry.getKey() 返回与此项对应的键

// entry.getValue() 返回与此项对应的值

System.out.print(entry.getValue());

}

System.out.println();

System.out.println(Calendar.getInstance().getTimeInMillis() – bs);

}

}

对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset 只是遍历了第一次,他把key和value都放到了entry中,所以就快了。

注:Hashtable的遍历方法和以上的差不多!