1、 程序和进程的本质区别是?
A、在外存和内存存储
B、非顺序和顺序执行机器指令
C、独占使用和分时使用计算机资源
D、静态和动态特征
参考答案分析:
进程与应用程序的区别:
进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。
C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。
多任务环境下应用程序进程的主要特点包括:
●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;
●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;
●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。
在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)
参考网址:http://blog.csdn.net/you_off3/article/details/7460914
2、 假设某算法的时间复杂度符合递推关系式T(n)=2T(n/2)+n,那么该算法的时间复杂度相当于
A、O(n)
B、O(lgn)
C、O(nlgn)
D、O(n2)
参考答案分析:
解析:由时间代价严格推出时间复杂度比较复杂,对于这种题,可用特例验证,不过需要注意的是特例不能取太少,至少n取到5,这样规律基本就可以确定了。
T(1)=1
T(2)=2T(1)+2=4
T(3)=2T(1)+3=5
T(4)=2T(2)+4=12
T(5)=2T(2)+5=13
很容易排除D选项,其递增速率介于O(n)和O(n2)之间,实际上可以参考归并排序的递推公式。
参考网址:http://www.shangxueba.com/ask/1581189.html
3、 下图一个非确定有限自动机(NFA)的状态转换,其等价的正规式为()
A、0*|(0|1)0
B、(0|10)*
C、0*((0|1)0)*
D、0*(10)*
参考答案分析:
根据分析题目中给出的状态转换图可知,该NFA可识别空串以及任意数目0组成的串,但若出现1,则其后至少要有1个0才能到达终态,因此,该自动机识别的串等价于正规式(0|10)*。
参考网址:http://www.shangxueba.com/ask/1379242.html
扩展阅读:
有限自动机(FiniteAutomata)
有限自动机(DeterministicFA)
非确定有限自动机(NondeterministicFA)
词法分析器的工作过程(参考阅读):
参考网址:
详细文献阅读:http://www.360doc.com/content/10/0927/19/832113_56859620.shtml
4、 IPv6地址占____个字节
A、4
B、6
C、8
D、16
参考答案分析:
IPv4采用32位地址长度,约有43亿地址,IPv6地址为128位长,但通常写作8组,每组为四个十六进制数的形式。例如:FE80:0000:0000:0000:AAAA:0000:00C2:0002 是一个合法的IPv6地址。
IPv4映像地址布局如下:
| 80bits |16 | 32bits |
0000....................0000 | FFFF | IPv4 address |
IPv4兼容地址写法如下:::192.168.89.9
如同IPv4映像地址,这个地址仍然是一个IPv6地址,只是0000:0000:0000:0000:0000:0000:c0a8:5909的另外一种写法罢了
参考网址:http://zh.wikipedia.org/wiki/IPv6
5、 以下关于RARP协议的说法中,正确的是()?
A、RARP协议根据主机IP地址查询对应的MAC地址
B、RARP协议用于对IP协议进行差错控制
C、RARP协议根据MAC地址求主机对应的IP地址
D、RARP协议根据交换的路由信息动态改变路由表
参考答案分析:
逆地址解析协议(Reverse Address Resolution Protocol,RARP),是一种网络协议,互联网工程任务组(IETF)在RFC903中描述了RARP[1]。RARP使用与ARP相同的报头结构,作用与ARP相反。RARP用于将MAC地址转换为IP地址。其因为较限于IP地址的运用以及其他的一些缺点,因此渐为更新的BOOTP或DHCP所取代。
RARP的工作原理:
1. 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
4. 如果不存在,RARP服务器对此不做任何的响应;
5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败
参考文献:
http://zh.wikipedia.org/wiki/%E9%80%86%E5%9C%B0%E5%9D%80%E8%A7%A3%E6%9E%90%E5%8D%8F%E8%AE%AE
6、 一栋大楼共及200层,某种类型的鸡蛋从某一楼层及其以上楼层下来时会被打破,从该楼层(即临界楼层)以下楼层摔下该鸡蛋,鸡蛋不会出现破损。现在给你2个完全一样的该种类型的鸡蛋,问:如何通过这2个鸡蛋找到该临界楼层?
参考答案分析:(智能题_假设只有100层_楼层的层数随意_思想关键_用算法解决分析实际问题)
假设我们从第2个楼层开始试探,往楼层号码渐次增长的方向,每隔数个楼层,试探一次,并在试探到第1个鸡蛋摔破的地方停下来,用第2个鸡蛋来从最近一次试探没有摔破的楼层之上的那个楼层开始逐个楼层进行试探,知道鸡蛋被摔破,我们就得到了临界楼层,如果鸡蛋一直没有被摔破,那么第一个鸡蛋摔破的楼层就是临界楼层。现在假设第2个楼层和下一次试探的楼层之间有x个楼层,即第2次试探的楼层号是A(2)=x+3,以后试探的楼层间隔分别减少1,那么我们第3次试探的楼层号为A(3)=2x+3,第4次为A(4)=3x+2,第5次为A(5)=4x,第n次为A(n)=(n-1)*x-(1/2)*n*n+(5/2)*n,这里需要注意,我们试探的n不能超过x+1,可以这么想来:跳跃测试的n不应超过第一次最大的跨度(也即第一种需要连续测试的区间大小),及n<=x+1。那么把x替换为n-1,得到A(n)=(1/2)*n*(n+1)+1。楼层为100,那么A(n)=(1/2)*n*(n+1)+1>=100,得到n(n+1)>=198,得n=14,x=13,那么A(n)=(31*n-n*n-26)/2. 即通过楼层2,16,29,41,52,62,71,79,86,92,97,101,(104,106).作为间隔就可以在使用2个鸡蛋,不超过14次测试的情况下找到临界楼层。
参考文献:http://blog.csdn.net/qianlizhima1/article/details/8615657
7、 请描述JAVA异常类的继承体系结构,以及JAVA异常的分类,并为每种类型的异常各举三个例子?
粉红色的是受检查的异常(checked exceptions),其必须被try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHeckedException 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守。
绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...
而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。
比如:AWTError、ThreadDeath、
参考网址:
http://blog.csdn.net/renfufei/article/details/16344847
http://blog.csdn.net/junlixxu/article/details/6096266
8、 描述Java类加载器的原理及其组织结构?
jvm classLoader architecture :
a、Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.
B、Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作
C、System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.
B、 User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.
参考文献:http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html
http://blog.csdn.net/zdwzzu2006/article/details/2253982
9、 在Web开发中,如何实现会话的跟踪?
参考答案分析:(分为三种:SSH会话、Cookies、URL重定向)
A、SSL会话(Secure Socket Layer)
安全套接字层,是一种运行在TCP/IP之上和像HTTP这种应用层协议之下的加密技术。SSL是在HTTPS协议中使用的加密技术。SSL可以让采用SSL的服务器认证采用SSL的客户端,并且在客户端和服务器之间保持一种加密了连接,在建立了加密连接的过程中,客户端和服务器都可以产生一种名为“会话密钥”的东西,它是一种用于加密和解密的对称密钥。基于HTTPS协议的服务器可以使用这个客户端的对称密钥来建立会话
B、Cookies
中文译为小甜饼,由Netscape公司发明,是最常用的跟踪用户会话的方式。Cookies是一种由服务器发送给客户端的片段信息,存储在客户端的内存或者硬盘上,在客户随后对该服务器的请求中发回它。其实主要就是把服务器为客户端分配的session ID保存在Cookies中,每次发送请求时把Cookies附加到请求对象中一起发过去,服务器得到这个唯一的session ID,从而可以唯一的标识一个客户端
3、URL重写
如果客户端禁用了Cookies,那么就只能用URL重写机制了。就是在URL中附加标识客户端的sessionID,web容器解析URL,取出session ID,根据这个session ID将请求与特定的session关联起来。
注意如果采用了URL重写,那么代码里面的所有url都要经过编码,response.sendRedirect(url)中的url用response.encodeRedirectURL(url)编码,其他的用response.encodeURL(url)来编码
参考网址:http://zhaomin819111.blog.163.com/blog/static/10659004200972525222991/
10、 请简述Spring架构中IOC的实现原理?
参考文献阅读:(怎样自己写一个Spring)
http://jiwenke.iteye.com/blog/493965
http://blog.csdn.net/it_man/article/details/4402245(blog写的很不错)
11、 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
[java] view plaincopy
- package algorithms.com.guan.javajicu;
- public class TestDemo {
- public static String output ="";
- public static void foo(inti){
- try{
- if(i == 1){
- throw new Exception();
- }
- }catch(Exception e){
- output += "2";
- return ;
- }finally{
- output += "3";
- }
- output += "4";
- }
- public static void main(String[] args) {
- foo(0);
- foo(1);
- System.out.println(output); //3423
- }
- }
考点分析:finally的执行时间
12、 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
[java] view plaincopy
- package algorithms.com.guan.javajicu;
- public class HelloB extends HelloA{
- public HelloB(){
- System.out.println("HelloB");
- }
- {
- System.out.println("I‘m B class");
- }
- static{
- System.out.println("static B");
- }
- public static void main(String[] args) {
- new HelloB();
- /**输出结果参考答案:
- * static A
- staticB
- I‘mA class
- HelloA
- I‘mB class
- HelloB
- */
- }
- }
- class HelloA{
- public HelloA(){
- System.out.println("HelloA");
- }
- {
- System.out.println("I‘m A class"); //这句话是什么时候加载?
- }
- static{
- System.out.println("static A");
- }
- }
考点分析:
- {
- System.out.println("I‘m B class");
- }
这叫初始化块,当创建一个对象的时候,它会先被执行(之后才是构造方法)
- static{
- System.out.println("static B");
- }
这个叫做静态代码块,当类被装载的时候就会执行该块代码
这两种都不叫方法。顺序是当类被加载就会执行静态代码块
如果该类被创建对象,就会先执行初始化块
之后才是构造方法
13、 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
[java] view plaincopy
- package algorithms.com.guan.javajicu;
- public class Inc {
- public static void main(String[] args) {
- Incinc = new Inc();
- int i = 0;
- inc.fermin(i);
- i= i ++;
- System.out.println(i); //输出结果为0
- }
- void fermin(int i){
- i++;
- }
- }
考点分析:
14、 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
[java] view plaincopy
- package algorithms.com.guan.javajicu;
- public class Example {
- Stringstr = new String("good");
- char[] ch = {‘a‘,‘b‘,‘c‘};
- public static void main(String[] args) {
- Exampleex = new Example();
- ex.change(ex.str, ex.ch);
- System.out.print(ex.str +"and");
- System.out.print(ex.ch);
- //参考答案输出结果:goodandgbc
- }
- public void change(Stringstr, char ch[]){
- str= "test ok";
- ch[0]= ‘g‘;
- }
- }
考点分析:
15、 检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
[java] view plaincopy
- packagealgorithms.com.guan.javajicu;
- import java.util.Date;
- public class SuperTest extends Date{
- private static final long serialVersionUID = 1L;
- private void test(){
- System.out.println(super.getClass().getName());
- //参考答案输出:algorithms.com.guan.javajicu.SuperTest
- }
- public static void main(String[]args){
- newSuperTest().test();
- }
- }
考点分析:
16、 任意2n个整数,从其中选出n个整数,使得选出的n个整数和同剩下的n个整数之和的差最小。
注解:这三个程序有空再贴上代码
17、 有两个有序的集合,集合的每个元素都是一段范围,求其交集,例如集合{[4,8],[9,13]}和{[6,12]}的交集为{[6,8],[9,12]}
可供参考的文献:
http://blog.csdn.net/jie1991liu/article/details/13168255
http://loveexception.iteye.com/blog/628744
http://bestchenwu.iteye.com/blog/1674624
18、 一个文件中有10000个数,用Java实现一个多线程程序将这个10000个数输出到5个不用文件中(不要求输出到每个文件中的数量相同)。要求启动10个线程,两两一组,分为5组。每组两个线程分别将文件中的奇数和偶数输出到该组对应的一个文件中,需要偶数线程每打印10个偶数以后,就将奇数线程打印10个奇数,如此交替进行。同时需要记录输出进度,每完成1000个数就在控制台中打印当前完成数量,并在所有线程结束后,在控制台打印”Done”.
可供参考的文献:
http://blog.csdn.net/vstar283551454/article/details/17362709