1.广义表即我们通常所说的列表(lists)。它放松了对表元素的原子性限制,允许他们有自身结构。
广义表的长度:最大括号中的 逗号数+1
广义表的深度:展开后含括号的层数。
2.数组和矩阵不同,数组元素可以是字符,即字符数组,矩阵中都是数
3.环境变量可在编译source code时指定
javac一次可同时编译数个Java源文件
javac.exe能指定编译结果要置于哪个目录(directory)
4.通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法。
通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成。
Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多。
5.覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。
覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点:
1)、索引项通常比记录要小,所以MySQL访问更少的数据。
2)、索引都按值得大小存储,相对于随机访问记录,需要更少的I/O。
3)、数据引擎能更好的缓存索引,比如MyISAM只缓存索引。
4)、覆盖索引对InnoDB尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引包含查询所需的数据,就不再需要在聚集索引中查找了。
限制:
1)、覆盖索引也并不适用于任意的索引类型,索引必须存储列的值。
2)、Hash和full-text索引不存储值,因此MySQL只能使用BTree。
3)、不同的存储引擎实现覆盖索引都是不同的,并不是所有的存储引擎都支持覆盖索引。
4)、如果要使用覆盖索引,一定要注意SELECT列表值取出需要的列,不可以SELECT * ,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。
6.
内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取。
简单来讲一个进程由于执行系统调用而开始执行内核代码,我们称该进程处于内核态中. 一个进程执行应用程序自身代码则称该进程处于用户态.
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态
所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作.
这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令
这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)
他们的工作流程如下:
- 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
- 用户态程序执行陷阱指令
- CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
- 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
- 系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果。
7.快速排序和堆排序的平均时间复杂度都是O(nlogn)
快速排序最差 n平方 归并排序最差nlogn
快速排序空间复杂度 logn 堆排序1
快速排序最好复杂度 nlogn 希尔排序n的1.3-2次方
8.UDP协议的特点 :没有拥塞控制
9.不能用来修饰interface的有 :private static protected
10.关于windows的消息机制
SendMessage等待消息处理完成后返回
线程可以没有消息队列
11. Windows中,以下关于动态链接库(DLL)的说法
DLL中可以导出变量
DLL不可以脱离EXE独立运行
12.软件工程的基本原则包括:抽象,信息隐蔽,模块化,局部化,确定性,一致性,完备性,可验证性。
13.进程的描述
进程是动态的概念
进程的执行需要CPU
进程具有生命周期
14.数据存储和数据流都是( 数据 ),仅仅是所处的状态不同
15.进程通信的途径:管道,信号量,消息队列,共享内存
16.
c语言中的union 是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值;
(1)32位:double 8字节,long 4字节,则最终12字节;
(2)64位:double8字节,long8字节,最终16字节
17.
基于TCP(面向连接)的Socket编程
一、客户端:
1、打开一个套接字(Socket);
2、发起连接请求(connect);
3、如果连接成功,则进行数据交换(read、write、send、recv);
4、数据交换完成,关闭连接(shutdown、close);
二、服务器端:
1、打开一个套接字(Socket);
2、将套接字绑定到服务器地址上(bind);
3、指定套接字为服务器套接字(listen),做好连接请求准备;
4、等待连接请求(connect);
5、如果连接请求到,则连接建立,进行数据交换(read、write、send、recv);
6、数据交换完成,关闭连接(shutdown、close);
基于UDP(面向无连接)的Socket编程
一、客户端\服务器端:
1、打开一个套接字(Socket);
2、将套接字绑定到指定的服务器地址和端口上(bind);
3、进行数据交换(read、write、send、recv);
4、数据交换完成,关闭连接(shutdown、close);
三、MFC对Socket的支持:
1、创建CAsyncSocket对象;
2、发送接收数据报(SendTo、RecvFrom);
3、连接服务器(Connect);
4、接收连接(Listen);
5、发送和接收流式数据(Send、Receive);
6、关闭套接字(Close);
7、差错处理(GetLastError)
18.
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.Exception
java.lang.Exception.RuntimeException
throw指令能够抛出Throwable及其子类