1:HashMap的实现原理:
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。(关于HashMap还需多研究,自己在数据结构和算法方面其实不太扎实的)
2.有没有sql优化方面的了解:
1). 减少没必要查询的字段数
2). 表关联尽量用主键
3). 查询条件尽量避免模糊查询
4). 避免使用排序字段,排序字段尽量使用主键
5). 尽量使用限制查询条件
6). 查询条件使用有效索引
(看了些文章,原来建索引也是其中一种方法,亏自己前几天还看过一点,面对面试的压力我还是露怯了没敢说自己的想法,其实优化方面还是自己也是多少可以说上几句的,数据库的知识还要深入挖掘)。
3.hibernate和mybatis的区别:
自己应该是可以答出,最大的区别应该是mybatis更加注重sql语句的书写,hibernate对sql封装的比较到位,对于要写复杂的sql使用mybatis,简单sql用hibernate比较好。
引用别人文章的观点:
(1)sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
(2)缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。
4.关于mybatis的缓存:
一级缓存
一级缓存是 SqlSession 级别的缓存,是基于 HashMap 的本地缓存。不同的 SqlSession 之间的缓存数据区域互不影响。
一级缓存的作用域是 SqlSession 范围,当同一个 SqlSession 执行两次相同的 sql 语句时,第一次执行完后会将数据库中查询的数据写到缓存,第二次查询时直接从缓存获取不用去数据库查询。当 SqlSession 执行 insert、update、delete 操做并提交到数据库时,会清空缓存,保证缓存中的信息是最新的。
MyBatis 默认开启一级缓存。
二级缓存
二级缓存是 mapper 级别的缓存,同样是基于 HashMap 进行存储,多个 SqlSession 可以共用二级缓存,其作用域是 mapper 的同一个 namespace。不同的 SqlSession 两次执行相同的 namespace 下的 sql 语句,会执行相同的 sql,第二次查询只会查询第一次查询时读取数据库后写到缓存的数据,不会再去数据库查询。
MyBatis 默认没有开启二级缓存,开启只需在配置文件中写入如下代码:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
5.关于spring对事物的处理:
事务的的特性:
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
在企业级应用中,多用户访问数据库是常见的场景,这就是所谓的事务的并发。事务并发所可能存在的问题:
1.脏读:一个事务读到另一个事务未提交的更新数据。
2.不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。
3.幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
4.丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。
spring对事务管理的实现方式:
(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于 TransactionProxyFactoryBean的声明式事务管理。
(3)基于 @Transactional 的声明式事务管理。
(4)基于Aspectj AOP配置事务
6.在数据库主从复制和分表分库的情况下ID怎么自增:
面试官先是问了怎么实现id自增,我说mysql有自带id自增的功能,随后他就说要是数据库在主从复制,分表分库情况下这样id就不一致,当时着实问到我了,他的意思是问我怎么保证id的一致性么?
今天第三家的面试题很奇怪,居然问window查看本机IP的命令是什么,IBM的数据库,问了webservice相关的,还问了hibernate和mybatis的本质区别是什么,试卷上好多问题感觉有点没头没脑的,而且用的技术比较老旧,他们是做医疗卫生行业的,所用的技术和我不太相配吧。