1.请说明一下EJB的几种类型分别是什么?
EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean)、实体Bean(Entity Bean)、消息驱动Bean(Message Driven Bean).EJB实际上是SUN的J2EE的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品.
1.Session Bean被用来完成一些服务器端的操作,例如:访问数据库、调用其它EJB组件,对于客户机来说,它还是一种非持久的对象. Session Bean还可分为Stateful Session Bean与Stateless Session Bean. 从内存方面来看,Stateful Session Bean会消耗J2EE Server较多的内存,而它的优势在于能维持使用者的状态。从生命周期来看,Stateless Session Bean的生命周期由容器决定的.
2.Entity Bean是域模型对象.用于实现O/R映射,负责将数据库中表的记录映射成Entity对象,Entity Bean是一种持久性对象。
3.Message Driven Bean 是EJB2.0中引入的新的企业Bean,实际上是一个异步无状态SessionBean.
补充:EJB基于JDNI(Java Naming & Directory Interface 即Java命名目录服务)、RMI(Remote Method Invaction即对象请求中介协议)、JTA(Java Transaction API即java事务服务)等技术实现的。
2. 锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。
锁机制: 有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改.
悲观锁:悲观的认为在数据的处理过程中极有可能存在修改数据的并发事务,于是将处理数据设置为锁定状态.悲观锁必须依赖数据库本身的锁机制才能真正保证数据访问的排他性.
乐观锁:对并发事务持乐观态度,通过更加宽松的锁机制来解决由于悲观锁对数据库系统造成的严重影响.(最常见的乐观锁是通过数据版本标识来实现的,读取数据时获得数据的版本号,更新数据时将此版本号加1,然后和数据库表对应记录的当前版本号进行比较,如果提交的数据版本号大于数据库中此记录的当前版本号则更新数据,否则认为是过期数据无法更新).
Hibernate中通过Session的get()和load()方法从数据库中加载对象时可以通过参数指定使用悲观锁;乐观锁可以通过给实体类加整型的版本字段再通过XML或@Version注解进行配置
3. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
}
}
补充:
二叉搜索树 :若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。
实现代码:
public class Solution {
//二叉搜索树转换为双向链表
public TreeNode Convert(TreeNode rootTree) {
//如果为空树,直接返回
if(rootTree==null) {
return null;
}
//遍历存储二叉树的结果
ArrayList<TreeNode> inorderlist=new ArrayList();
//中序遍历二叉树
inorder(rootTree, inorderlist);
int n=inorderlist.size();
for(int i=0;i<n;i++) {
if(i>0) {
inorderlist.get(i).left=inorderlist.get(i-1);
}
if(i<n-1) {
inorderlist.get(i).right=inorderlist.get(i+1);
}
}
//返回头指针
return inorderlist.get(0);
}
//中序遍历二叉树
public static void inorder(TreeNode root,ArrayList<TreeNode> list) {
if(root==null) {
return ;
}
inorder(root.left,list);
list.add(root);
inorder(root.right,list);
}
}