面试随笔——记录一些面试中碰到的问题(初级/中级Java开发)

Q:为什么HashMap是非线程安全的?在什么情况下会发生非线程安全问题?

A:HashMap是非同步的,一个线程中的写操作或者扩容操作对其他线程并不可见(线程内进行修改,只会修改线程内存中的数据,线程结束后才会将数据写入到主内存中),就导致多个线程操作同一个HashMap,产生碰撞后,线程结束后,最后结果为最后提交的线程数据,前面线程提交的数据全部被覆盖,HashMap的修改操作、扩容操作(由于进行了扩容,HashMap会对所有元素进行重排,时间复杂度为O(N))都会造成此问题。


Q:ConcurrentHashMap与悲观锁行的Map的优势是什么?

A:可以通过Collections.synchronizedMap()方法,获得一个线程安全的Map,这个Map并不是HashMap,也是Map的一种实现,代码中实现了Map接口,特点是:使用了synchronized来进行互斥。而ConcurrentHashMap并未对整个Map进行悲观锁的限制,将整个HashMap拆分成了多个块,也就是分段锁,每个数据块也被成为segment,内部有一个hashEntry;只有当多个线程同时操作同一个segment时才会产生竞态,并发性能较好。


Q:Spring mvc和Struts两者实现上的区别?

A:此问题解释不全,只有我了解到的一部分,

    1、Struts(StrutsPrepareAndExecuteFilter)通过filter是现实,而Spring mvc(DispatcherServlet)通过servelt实现,实现了对请求的转发,而Struts是类级别的拦截,每次请求会创建一个Action,一个Action对应了一个request的上下文,但是会将request的数据注入到类属性中,整个类中都可以共享,即一个Action对应了一条URL但是request的属性确被整个类共享;Spring mvc是方法级别的拦截,每个方法对应了一个request的上下文,request所有属性都是方法独有,每个url和一个方法对应,更适合于restful 的实现。

    2、Spring mvc基本实现了100%零配置都可通过注解的方式,而Struts中扔存在了大量的struts*.xml的配置文件

参考:转:http://blog.csdn.net/silenttalfrede/article/details/52950762

Q:为什么操作float(浮点类型)、double(双精度)数据类型进行计算会造成精度丢失(此问题出现于金融项目)?

A:float(浮点类型)、double(双精度)都是基于科学计算法的数据类型,在计算机语言中保存的浮点和双精度类型计算式都是通过转为二进制进行计算的,但是二进制无法准备的表达所有的十进制数,就像0.1+0.1并不等于0.2一样,二进制描述部分十进制都是无限趋近,所以通过这两种类型的计算时会导致精度丢失,建议通过BigDecimal来进行十进制的精确加减运算,BigDecimal存在四个构造函数,建议使用BigDecimal(String),此类型的并不是基本类型,而是BigDecimal对象,他的加减乘除需要调用它本身的加减乘除方法。


Q:memcache和Redis两者的差异?

A:此问题答案较多,下面的描述可能不全面

    1、Redis中的数据并非一直都存储在缓存中,当内存用尽时,Redis会将很久没用的value交换到磁盘上,而memcache是一直存放在缓存中

    2、memcache只支持String的数据格式,Redis支持更多的数据格式:String、List、Set、hash、Sort Set

    3、Redis支持数据的备份,支持Master-Slave数据备份形式,支持一主多从的数据备份

    4、Redis可以将缓存的数据持久化到磁盘中,重启后,可重新加载再使用,一般作用于容灾备份

    5、断电后memcache的数据会直接丢失(由于一直在缓存中,断电后消失),Redis可以通过快照或者AOF日志的方式重新获取到数据。

    6、分布式缓存时,两者的集群实现方式有差异,memcache只能通过客户端算法,来获取到数据所在的缓存节点,而Redis可以在服务端配置分布式缓存,Redis cluster分布式存储架构,具体详细的可参考此文章:转:https://www.cnblogs.com/yangxiaolan/p/5786123.html


Q:My SQL中单列索引和组合索引的区别,表table存在三个字段a、b,c,存在如下SQL:

         SELECT * FROM table WHERE a= '' AND b= '' AND c=''

    第一种情况:单列a、单列b,单列c索引;第二种情况a、b、c组合索引a_b_c,两者的查询效率?

A:存在差异,使用三个单列索引时,虽然有了多个索引,但是MySQl只会用到数据库认为的最有效率的单键索引而不是三个索引,使用组合索引时效率更高,而组合索引应警惕最左前缀(Leftmost Prefixing)失效的问题。创建组合索引后,单独查字段a,b,c并不一定会用到索引,用字段a,b,c创建组合索引时,其实会产生如下几种索引:(1) a;(2)a_b;(3)a_b_c;相当与创建以上的三种索引,即查询条件中出现(1)WHERE a= '';(2)WHERE a= '' AND b= '';(3)WHERE a= '' AND b= '' AND c=''才会触发索引,而比如说 WHERE b= '' AND c=''/WHERE  c=""并不会触发索引,参考:转:http://blog.csdn.net/moxiaomomo/article/details/8805693

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值