以下文字站在面试官的视角,描述了java程序员面试的过程:(原文地址:http://www.mianwww.com/html/2013/05/18392.html )
今天面试了一个开发人员,86年的,4年工作经验。职位是高级软件工程师。首先介绍了一下公司情况,知道他比较紧张,缓和一下气氛,然后就开始问技术问题。
首先看到简历上写的项目经验,发现有Linux和Unix经验,我就问,你对VI熟吗,他说熟,然后我就问了一些VI操作,答的一知半解。本来想问问操作系统启动过程的,
想想他作为Java程序员有点难,就没问。接着突然想到吕永生老师说过的经验,问问对方什么最熟,然后就问什么,于是我问你在Java里面什么最熟悉,他想了一会,
我给了他一些提示,例如Java基础,JDBC,SQL等,然后他说Java基础,于是我问了以下问题,Java的Class Loader机制,TreeMap和HashMap的区别,Map和Set
和List区别。答的不流利,且错误百出。接着,我问对JDBC熟吗?他说熟,我给他一张纸,“写一下Java建立数据库连接的语句”,他是一点都不会。这时候我给他提示:
1.加载驱动,2.建立连接,3.执行sql,4.操作结果。他还是不会。于是我给他写出来,然后指着Class.forName(), 问里面到底执行了什么呢?他茫然。接着又让他写了一个
单例程序。接着又问了框架的东西,Struts,Spring,JPA,几乎一点都不会。接着我说,你等等,我叫另一个同事看看,于是他在会议室里等待,这时候我看到他站起来
小踱,有点着急。现在经济不景气,工作不好找,还是安心学点英语,技术吧。程序员太浮躁了,我有时候也是,所谓不学习就要落后,要时刻保持清醒的学习态度。谦虚
谨慎,不骄不躁。
在上面的场景中面试官问到的问题:
1.vi操作:
vi的三种模式:命令行模式、插入模式、末行模式;
编辑: i
退出: :q 强制退出: :q!
保存: :w 保存并退出: wq! 或者 :x = :wq
方向键: 左:h 右:l 上:k 下:j
光标向前跳过一个单词:w 光标向后跳过一个单词:b
删除: 整行删除:dd
向下寻找名为word的字符串: /word
向上寻找名为word的字符串: ?word
2.linux操作系统启动过程(来自LinuxCast.net):
1).BIOS
2).MBR(512字节,前446字节为引导代码)
3).GRUB(Linux的主流引导程序,配置文件:/boot/grub/grub.conf)
4).加载内核
5).init(初始化)
6).runlevel
3.Java的Class Loader机制,TreeMap和HashMap的区别,Map、Set、List的区别:
1)Class Loader机制:
从JDK1.2开始,类的加载过程采用父类委托机制,这种机制能更好的保证java平台的安全。在此委托机制中,除了JVM自带的根类加载器以外,其余的类加载器
都有且只有一个父加载器。当java程序请求加载器A加载类coo时,A先委托自己的父加载器去加载coo类,若父加载器能加载,则由父加载器完成加载任务。否则,
才由加载器A本身去加载coo类。在类加载中的父亲委托机制中,各加载器按照父子关系形成树结构。
根类加载器
|
扩展类加载器
|
系统类加载器
|
loader1(用户自定义类加载器)
|
loader2(用户自定义类加载器)
Class Sample = loader2.loadClass("Sample");
loader2先从自己的命名空间查找Sample类是否已被加载。若已加载,就直接返回已加载类对象的引用。若未被加载,loader2会请求loader1代为加载,若loader1依然
在命名空间中找不到Sample。则loader1将向系统类加载器发出请求,让系统类加载器来加载Sample类。以此类推(loader2及其父类加载器的关系是包装的关系)。
若loader2及其父类加载器都不能加载类到虚拟机,则抛出ClassNotFoundException异常。
父类委托机制的优点:
提高了软件系统的安全性。在此机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类。并且可以防止不可靠的甚至是恶意的代码,代替由父类加载器
加载的可靠代码。
2)TreeMap、HashMap的区别:
TreeMap:实现map接口,把元素存储在树中。比HashMap慢;
基于红黑树实现。适合于 按自然顺序、自定义顺序遍历键。
HashMap:是键(k)值(v)对的形式,key不能重复,但是value可以重复;
基于哈希表实现。适合于 在Map中插入、删除、定位元素。
3) Map、Set、List的区别:
Map:Map接口为我们提供完成map改变、map查询、map视图的功能的方法;
Set:无序集合,不可重复元素;
List:一个有序可重复的集合。
4. JDBC--Java建立数据库连接的语句,Class.forName()里面到底执行了什么?
jdbc建立数据库连接的过程:
0).参数化;
1).加载和注册数据库驱动;
2).连接数据库;
3).创建Statement对象;
4).操作数据库,执行SQL语句;
5).处理数据;
6).释放资源,断开与数据库的连接;
Class.forName(" ") : Class实例是JVM在加载一个类时自动创建的,程序无法用new语句创建java.lang.Class类的实例,因为Class类没有提供public类型的构造方法。
为了使程序能获得代表某个类的class实例,在Class类中提供了静态工厂方法 forName(String classname)。forName("foo")方法对foo类主动初始化,细节的东西、实现还要
看Class.forName()方法的源代码。口说无凭,代码为证。
例如:
Class c = Class.forName("java.util.Date");
//返回java.util.Date类的实例;
Object obj = c.newInstance(); //在jdk中,newInstance()方法常是静态工厂方法
5. 单例程序
public class SingleT {
private static SingleT st; //唯一对象的指针或称为引用;
private SingleT(){ //私有构造;
}
public static SingleT getNewInstance(){ //静态方法返回对象;
if(st == null){ //多线程情况,可能会有多个实例,加synchronized保证线程安全;
st = new SingleT();
}
return st;
}
}
6. 框架的东西 Struts,Spring,Hibernate 及Servlet、JPA
1).Struts2 工作流程:
1.访问JSP页面(loo.jsp);
2.提交表单后,数据提交给(/struts2/loo.action);
3.struts2截获所有请求,包括loo.action的请求;
4.查找struts.xml,loo.action对应的looAction;
5.生成一个looAction实例将提交的数据设置进去,调用实例的execute()主方法;
6.跳转到JSP中显示结果,丢弃looAction实例。
2).Spring 的IOC 、AOP 、 MVC:
IOC(控制反转):也叫DI(依赖注入)。指对象之间的依赖由外部(Spring容器)在运行时给定。
AOP(面向切面编程):可以将遍布应用各处的功能分离出来形成可重用的组件。
MVC:SpringMVC 基于Model-View-Controller->MVC(模型-视图-控制器)模式实现。
3).Hibernate:
一个对象关系映射框架。对JDBC进行轻量级对象封装,可用面向对象的思想来操纵数据库。
4).JPA (Java Persistence API ):
Java持久化的规范。是对开源ORM的更高层次的抽象。
5).Servlet:
Servlet是一个能够处理请求并输出html的.java文件。
Servlet的基本生命周期:
a. 当Web客户请求Servlet服务器或当Web服务启动时,容器环境加载一个Servlet类;
b. 容器环境根据客户请求创建一个或多个Servlet对象实例,并把这些实例加入到Servlet实例池中;
c. 容器环境调用Servlet的init()方法进行Servlet初始化。在调用初始化时,要给init()方法传入一个ServletConfig对象,ServletConfig对象包含初始化参数和容器环境信息;
d. 容器环境利用HttpServletRequest和HttpServletResponse对象,封装从Web客户接收到的HTTP请求和由Servlet生成的响应;
e. 容器环境把HttpServletRequest和HttpServletResponse对象传递给HttpServlet的service()方法;
f. Servlet从HttpServletRequest对象读取HTTP请求数据,访问来自HttpSession或Cookie对象的状态信息,进行特定应用的处理,并且用HttpServletResponse对象
生成响应数据;
g. 当web服务器和容器关闭时,调用HttpServlet.destory()方法关闭任何打开的资源。
注: