面试小记

时间是2013年8月29号下午16点,星期四,天气是雷阵雨,事件是面试,结果是非常失败。

凭着印象记下这几道面试题:

1.java序列化问题。一个User类序列化以后,添加或者删除里面的字段,然后再反序列化是否可行?
回答:这个我没有试过,因为在我印象中被transient(瞬时)修饰的字段是不能够序列化的,所以就说了,可以,结果,我回来一试,抛异常了,不管添加或是删除字段,都会抛出java.io.InvalidClassException: com.serializable.User; local class incompatible: stream classdesc serialVersionUID = 6599240241420329073, local class serialVersionUID = 5117558823115306911,然后我一看见异常是序列号不一致,因为我刚才写的User类只实现了Serializable接口,没有给出serialVersionUID默认值,系统估计会自动生成,所以,我把serialVersionUID加上了,重新试了下,居然成功了,我的回答也不是完全错,只是没有说清楚场景(有没有默认serialVersionUID值)。也就是说,平时,我们写实现Serializable接口时,一定要给个默认的serialVersionUID,这样,当这个类再添加或是删除字段时,也可以正常运行。

2.计数问题。说说高并发怎么统计计数。
回答:我说用volatile int和AtomicInteger,volatile修饰的变量只要不依赖自己,就可以正确计数,AtomicInteger也是可以计数的,然后面试官说,有问题,volatile如果有问题我还理解,为什么AtomicInteger也有问题,我无法解释清楚。

3.mongodb和redis的区别及redis的持久化。
回答:mongodb是数据库,redis是缓存服务器,完了,上网查了才知道,redis还叫支持持久化的内存数据库。redis的持久化这点确实不清楚,刚刚查了下,网上资料比较多,分Snapshotting和Append-only file两种。前者是一定时间间隔修改一定数量的key,然后,把内存中的数据持久化,后者是每个write操作,都会做一次持久化,持久化的是命令,还可以进行优化,把内存中的数据作出命令快照持久化。

4.数据库事务问题。问的问题是个场景,我简化一下,其实问的是脏读在数据库里是否会出现。我现在查了资料,面试官问的那个场景是脏读现象。
回答:不存在,只有修改提交了别人才会看见修改的数据。然后我中间又说了一大堆,我称之为废话,此处省略100个字,后来我才反应过来,考的数据库事务的隔离级别,我只知道是4个级别,级别越高,并发越低,当时他说怎么避免脏读,其实就是说给数据库事务设定一个隔离级别,我当时说了最高的级别(serializable),现在我知道了,要避免脏读,只需要read committed就行了。这个问题回答的也不是很好,主要是平时没有人去改数据库的隔离界别,采用的是默认的,(mysql的innodb引擎默认是repeatable read,oracle默认是read committed)。事务除了有隔离级别外,还有传播级别,下次写篇关于数据库事务的博客。

哎,今天真是失败。

此条目发表在生活笔记分类目录,贴了标签。将固定链接加入收藏夹。