2010-12-09

几道java题

前阵子有个活儿,要出几道java题,主要考察:java基本,常用算法,annotation based spring/Hibernate(JPA) 是否熟练,每个部分不超过3个问题。 回答环境没有电脑,只有嘴+白板,时间尽量控制在60分钟以内(包括交谈)。现在这题已经用完了,翻译成中文贴这了。 不知道是不是整的太简单了。



java基础的 (2,3里选1题)
---------
1说运行结果: (预计2分钟)
Integer a = 707;
Integer b = 707;
System.out.println(a>=b);
System.out.println(a<=b);
System.out.println(a==b);  

a = 70;
b = 70;
System.out.println(a>=b);
System.out.println(a<=b);
System.out.println(a==b);  

2 如果一个类的一个private属性没有setter/getter方法, 这个属性的值可以被其他类获取/修改么?(如果回答可以,how) (3分钟)

3 简单介绍一下jvm的"warming up"。

4 通过class diagram(UML) 描述所有知道的java collection framework的classes 的相互关系。 (15-20分钟)

简单算法 (选2个问)
------
1 描述 Quick sort (5分钟)
2 描述 筛选法求质数 (5分钟)
3 如何存储稀疏矩阵 (3分钟)

Spring/Hibernate/jpa
----------------
1 什么是nested transactions? 具体在hibernate和JPA 的环境下如何定义(annotation based)?(1-2分钟)

2 下面伪代码的TryItOut class 中 tryIt()方法执行过程中,数据库会发生下面那种变化?说原因(5分钟)
    a - 执行完毕后,数据库没发生变化
    b - 当执行processList()方法,在for loop中处理List l中的元素的时候,每执行一次doUpdate(e), 数据库的相应记录将被更新
    c - myservice的processList方法执行过程中,数据库无变化,当该方法执行完毕,List l中的相应记录在数据库一次被更新。
public interface MyService{
    void doUpdate(Entity e);
    void processList();
}

@Service
public class MyServiceImpl implements MyService{
    @Autowired
    private EntityDao dao; // assume that EntityDao has methods doUpdate() and getAllEntries()
    
    @Transactional(readOnly=false) //declare transaction
    public void doUpdate(Entity e){
        dao.update(e);
    }

    public void processList(){
        List<Entity> l = dao.getAllEntries();
        for(Entity e : l){
            //here do some changes on the entity
            e.setX(foo);
            e.setY(bar);
            ....
            //now we want to do database update
            doUpdate(e);        
        }
    }

}

public class TryItOut{
    @Autowired
    private MyService myService;
    
    public void tryIt(){
        myService.processList();
    }
}

3 下面的代码片段意图是在OneBean实例化的时候利用其它的spring bean来初始化title属性。有没有问题,为什么?如果是有问题,如何改正? (5分钟)
@Component
public class OneBean{
    @Autowired
    private AnotherBean bean2; //Assume AnotherBean has property: String title, with getter and setter.

    private int a = 5;
    private String title = "OneBean_" + bean2.getTitle();

    //some other codes
    .....

}

简单说下想法

1.1,这个可能很多人都被问过。主要就是那两个"=="的比较。java是比较引用的,但是有个autoboxing。如果有这个意识,很容易就能答了,707的==,是false, 70 的 == 是True。

1.2 reflection可以实现

1.3 这个warming up的问题曾经遇到过。尤其是那种效率要求比较高的消息处理应用,应该避免jvm warming up的这个阶段,因为这个阶段速度比较慢。

1.4 collection恐怕是最常用的基本点之一了,所以这个得心里有数。

2算法的都是常用或常识的,不说了。

3.1 nested transaction JPA 不支持
3.2 应该是a,数据库无变化。 因为spring是proxy based aop。transaction manager也是要以proxy来管理transaction. 尽管那个update方法定义了transaction,但是调用的时候没经过proxy,是自身类里调用的,所以压根transaction manager就没起作用。虽然不报错,但是数据库没有变化。这个在spring文档关于transaction manager里有写,也是平时容易犯的错误之一。

3.3 这个在spring bean初始化的时候会报错,也是常见错误之一。因为bean2还没injected呢。 如果非要用spring bean来初始化另一个spring bean的成员变量,可以写一个方法 init()来做,然后定义这个方法的annotation为@PostConstruct 这样在这个方法里就可以引用已经injected bean了。但spring 缺省单例模式,这个要注意。