1个小时笔试
1. JSP与Servlet的区别
JSP的优点是擅长于网页制作,生成动态页面,比较直观。JSP的缺点是不容易跟踪与 排错。
Servlet是纯Java语言,擅长于处理流程和业务逻辑。Servlet的缺点是生成动态网页不 直观。
2. JQuery +HTML+JS, 实现点击按钮,显示图片
3. 使用过的数据库,MySQL, Oracle, 比较应用场景和好处
4. 解释Hibernate中悲观锁和乐观锁。做过的项目中如何处理并发, 批处理?
Hibernate中乐观锁和悲观锁的实现:
悲观锁:依靠数据库提供的锁机制。
乐观锁:基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数 据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对 应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
Hibernate的加锁模式有:
LockMode.NONE : 无锁机制。
LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动
获取。
LockMode.READ : Hibernate在读取记录的时候会自动获取。
以上这三种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update
过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上WRITE锁。
LockMode.UPGRADE :利用数据库的for update子句加锁。
LockMode. UPGRADE_NOWAIT :Oracle的特定实现,利用Oracle的for update nowait子句实现加锁。
Hibernate的悲观锁,也是基于数据库的锁机制实现。 下面的代码实现了对查询记录的加锁:
1String hqlStr = "from TUser as user where user.name=’Erica’";
2Query query = session.createQuery(hqlStr);
3query.setLockMode("user",LockMode.UPGRADE); //加锁
4 List userList = query.list();//执行查询,
获取数据 query.setLockMode 对查询语句中特定别名所对应的记录进行加锁(我们为 TUser类指定了一个别名“user”),这里也就是对返回的所有user记录进行加锁。 观察运行期Hibernate生成的SQL语句:
1select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex from t_user tuser0_ where (tuser0_.name=’Erica’ ) for update
这里Hibernate通过使用数据库的for update子句实现了悲观锁机制。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock
注意,只有在查询开始之前(也就是Hiberate 生成SQL 之前)设定加锁,才会 真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含for update 子句的Select SQL加载进来,所谓数据库加锁也就无从谈起。
Hibernate使用乐观锁的步骤:
1. 定义首先为TUser的class描述符添加optimistic-lock属性:
2. 添加一个Version属性描述符。version 节点必须出现在ID 节点之后。
代码内容
1Criteria criteria = session.createCriteria(TUser.class);
2criteria.add(Expression.eq("name","Erica"));
3List userList = criteria.list();
4TUser user =(TUser)userList.get(0);
5Transaction tx = session.beginTransaction();
6user.setUserType(1); //更新UserType字段
7 tx.commit();
每次对TUser进行更新的时候,我们可以发现,数据库中的version都在递增。
参考:http://www.blogjava.net/baoyaer/articles/203445.html
5. 解释Memcache和Redis的不同,使用过两种缓存系统吗,还了解其他缓存系统吗。针对一个项目,如何选择缓存系统?
6. 解释Python中的深拷贝和浅拷贝,在Java和C中有没有类似的实现?
7. 写一条简单的SQL语句,查询出按总分降序排序的学号、姓名和总分。
8. 32位机子,union{ int i; char a[2]}A ; 如果A.a[1] = 18 a[0]=1, 问A.i = ?
9. X = 1; y =2; k =3; k*=x+y; 问k最终为多少?
10. 在Linux系统中查询cpu状态、内存占用情况的命令?
11. Linux中用shell写查询本机ip的方法?或者将 当前文件夹下 文件大小 小于1k的文件全部移动到指定的文件夹。
12. 介绍一下项目使用过的设计模式,并画出类图。解释应用场景和好处。
a) 装饰器模式
b) 简单工厂
c) 抽象工厂
d) 监听模式
e) 原型模式
f) 单例模式
13. 用Python, PHP或者Java等实现单例模式。
14. 实现将字符串倒置,不另外分配空间。使用了C和指针实现。
15. 在C++中引入C编译后的代码,为什么加入extern C的符号。为了正确识别编译格式。
16. C语言函数中对指针赋值,申请变量是不正确的,main在函数调用接受内存内容被释放。
17. 解释 对象存储,文件存储,块存储的区别?
18. TCP/IP连接建立的过程
19. 解释MVC模式,介绍一种MVC模式的实现。