Q:為什么HashMap是非線程安全的纬霞?在什么情況下會(huì)發(fā)生非線程安全問題?
A:HashMap是非同步的理郑,一個(gè)線程中的寫操作或者擴(kuò)容操作對(duì)其他線程并不可見(線程內(nèi)進(jìn)行修改痢士,只會(huì)修改線程內(nèi)存中的數(shù)據(jù)髓帽,線程結(jié)束后才會(huì)將數(shù)據(jù)寫入到主內(nèi)存中),就導(dǎo)致多個(gè)線程操作同一個(gè)HashMap胳蛮,產(chǎn)生碰撞后麸粮,線程結(jié)束后,最后結(jié)果為最后提交的線程數(shù)據(jù)酬滤,前面線程提交的數(shù)據(jù)全部被覆蓋签餐,HashMap的修改操作、擴(kuò)容操作(由于進(jìn)行了擴(kuò)容盯串,HashMap會(huì)對(duì)所有元素進(jìn)行重排氯檐,時(shí)間復(fù)雜度為O(N))都會(huì)造成此問題。
Q:ConcurrentHashMap與悲觀鎖的Map的優(yōu)勢(shì)是什么体捏?
A:可以通過Collections.synchronizedMap()方法冠摄,獲得一個(gè)線程安全的Map,這個(gè)Map并不是HashMap几缭,也是Map的一種實(shí)現(xiàn)河泳,代碼中實(shí)現(xiàn)了Map接口,特點(diǎn)是:使用了synchronized來進(jìn)行互斥年栓。而ConcurrentHashMap并未對(duì)整個(gè)Map進(jìn)行悲觀鎖的限制拆挥,將整個(gè)HashMap拆分成了多個(gè)塊,每個(gè)數(shù)據(jù)塊也被稱為segment某抓,內(nèi)部有一個(gè)hashEntry纸兔;只有當(dāng)多個(gè)線程同時(shí)操作同一個(gè)segment時(shí)才會(huì)產(chǎn)生競(jìng)態(tài)惰瓜,并發(fā)性能較好。
Q:Spring mvc和Struts兩者實(shí)現(xiàn)上的區(qū)別食拜?
A:此問題解釋不全鸵熟,只有我了解到的一部分,
1负甸、Struts(StrutsPrepareAndExecuteFilter)通過filter現(xiàn)實(shí)流强,而Spring mvc(DispatcherServlet)通過servelt實(shí)現(xiàn),實(shí)現(xiàn)了對(duì)請(qǐng)求的轉(zhuǎn)發(fā)呻待,而Struts是類級(jí)別的攔截打月,每次請(qǐng)求會(huì)創(chuàng)建一個(gè)Action,一個(gè)Action對(duì)應(yīng)了一個(gè)request的上下文蚕捉,但是會(huì)將request的數(shù)據(jù)注入到類屬性中奏篙,整個(gè)類中都可以共享,即一個(gè)Action對(duì)應(yīng)了一條URL但是request的屬性確被整個(gè)類共享迫淹;Spring mvc是方法級(jí)別的攔截秘通,每個(gè)方法對(duì)應(yīng)了一個(gè)request的上下文,request所有屬性都是方法獨(dú)有敛熬,每個(gè)url和一個(gè)方法對(duì)應(yīng)肺稀,更適合于restful 的實(shí)現(xiàn)。
2应民、Spring mvc基本實(shí)現(xiàn)了100%零配置都可通過注解的方式话原,而Struts中扔存在了大量的struts*.xml的配置文件
參考:轉(zhuǎn):http://blog.csdn.net/silenttalfrede/article/details/52950762
Q:為什么操作float(浮點(diǎn)類型)、double(雙精度)數(shù)據(jù)類型進(jìn)行計(jì)算會(huì)造成精度丟失(此問題出現(xiàn)于金融項(xiàng)目)诲锹?
A:float(浮點(diǎn)類型)繁仁、double(雙精度)都是基于科學(xué)計(jì)算法的數(shù)據(jù)類型,在計(jì)算機(jī)語言中保存的浮點(diǎn)和雙精度類型計(jì)算式都是通過轉(zhuǎn)為二進(jìn)制進(jìn)行計(jì)算的归园,但是二進(jìn)制無法準(zhǔn)備的表達(dá)所有的十進(jìn)制數(shù)黄虱,就想0.1+0.1并不等于0.2一樣,二進(jìn)制描述部分十進(jìn)制都是無限趨近庸诱,所以通過這兩種類型的計(jì)算時(shí)會(huì)導(dǎo)致精度丟失悬钳,建議通過BigDecimal來進(jìn)行十進(jìn)制的精確加減運(yùn)算,BigDecimal存在四個(gè)構(gòu)造函數(shù)偶翅,建議使用BigDecimal(String)默勾,此類型的并不是基本類型,而是BigDecimal對(duì)象聚谁,他的加減乘除需要調(diào)用它本身的加減乘除方法母剥。
Q:memcache和Redis兩者的差異?
A:此問題答案較多,下面的描述可能不全面
1环疼、Redis中的數(shù)據(jù)并非一直都存儲(chǔ)在緩存中习霹,當(dāng)內(nèi)存用盡時(shí),Redis會(huì)將很久沒用的value交換到磁盤上炫隶,而memcache是一直存放在緩存中
2淋叶、memcache只支持String的數(shù)據(jù)格式,Redis支持更多的數(shù)據(jù)格式:String伪阶、List煞檩、Set、hash栅贴、Sort Set
3斟湃、Redis支持?jǐn)?shù)據(jù)的備份,支持Master-Slave數(shù)據(jù)備份形式檐薯,支持一主多從的數(shù)據(jù)備份
4凝赛、Redis可以將緩存的數(shù)據(jù)持久化到磁盤中,重啟后坛缕,可重新加載再使用墓猎,一般作用于容災(zāi)備份
5、斷電后memcache的數(shù)據(jù)會(huì)直接丟失(由于一直在緩存中赚楚,斷電后消失)陶衅,Redis可以通過快照或者AOF日志的方式重新獲取到數(shù)據(jù)。
6直晨、分布式緩存時(shí),兩者的集群實(shí)現(xiàn)方式有差異膨俐,memcache只能通過客戶端算法勇皇,來獲取到數(shù)據(jù)所在的緩存節(jié)點(diǎn),而Redis可以在服務(wù)端配置分布式緩存焚刺,Redis cluster分布式存儲(chǔ)架構(gòu)敛摘,具體詳細(xì)的可參考此文章:轉(zhuǎn):https://www.cnblogs.com/yangxiaolan/p/5786123.html
Q:My SQL中單列索引和組合索引的區(qū)別,表table存在三個(gè)字段a乳愉、b兄淫,c,存在如下SQL:
? ? ? ? SELECT * FROM table WHERE a= '' AND b= '' AND c=''
第一種情況:?jiǎn)瘟衋、單列b蔓姚,單列c索引捕虽;第二種情況a、b坡脐、c組合索引a_b_c泄私,兩者的查詢效率?
A:存在差異,使用三個(gè)單列索引時(shí)晌端,雖然有了多個(gè)索引捅暴,但是MySQl只會(huì)用到數(shù)據(jù)庫認(rèn)為的最有效率的單鍵索引而不是三個(gè)索引,使用組合索引時(shí)效率更高咧纠,而組合索引應(yīng)警惕最左前綴(Leftmost Prefixing)失效的問題蓬痒。創(chuàng)建組合索引后,查字段a漆羔,b梧奢,c并不一定會(huì)用到索引,用字段a钧椰,b粹断,c創(chuàng)建組合索引時(shí),其實(shí)會(huì)產(chǎn)生如下幾種索引:(1) a嫡霞;(2)a_b瓶埋;(3)a_b_c;相當(dāng)與創(chuàng)建以上的三種索引诊沪,即查詢條件中出現(xiàn)(1)WHERE a= ''养筒;(2)WHERE a= '' AND b= '';(3)WHERE a= '' AND b= '' AND c=''才會(huì)觸發(fā)索引端姚,而比如說 WHERE b= '' AND c=''/WHERE? c=‘’等并不會(huì)觸發(fā)索引晕粪,參考:轉(zhuǎn):http://blog.csdn.net/moxiaomomo/article/details/8805693