1.在重寫equals方法時(shí),需要遵循哪些約定,具體介紹一下?
重寫equals方法時(shí)需要遵循通用約定:自反性、對(duì)稱性、傳遞性、一致性.、非空性
1)自反性
對(duì)于任何非null的引用值x,x.equals(x)必須返回true。---這一點(diǎn)基本上不會(huì)有啥問題
2)對(duì)稱性
對(duì)于任何非null的引用值x和y,當(dāng)且僅當(dāng)x.equals(y)為true時(shí),y.equals(x)也為true。
3)傳遞性
對(duì)于任何非null的引用值x、y、z。如果x.equals(y)==true,y.equals(z)==true,那么x.equals(z)==true。
4)一致性
對(duì)于任何非null的引用值x和y,只要equals的比較操作在對(duì)象所用的信息沒有被修改,那么多次調(diào)用x.eqals(y)就會(huì)一致性地返回true,或者一致性的返回false。
5)非空性
所有比較的對(duì)象都不能為空。
2.Synchronized優(yōu)化后的鎖機(jī)制簡(jiǎn)單介紹一下,包括自旋鎖、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖?
自旋鎖:
線程自旋說白了就是讓cup在做無用功,比如:可以執(zhí)行幾次for循環(huán),可以執(zhí)行幾條空的匯編指令,目的是占著CPU不放,等待獲取鎖的機(jī)會(huì)。如果旋的時(shí)間過長會(huì)影響整體性能,時(shí)間過短又達(dá)不到延遲阻塞的目的。
偏向鎖:
偏向鎖就是一旦線程第一次獲得了監(jiān)視對(duì)象,之后讓監(jiān)視對(duì)象“偏向”這個(gè)線程,之后的多次調(diào)用則可以避免CAS操作,
說白了就是置個(gè)變量,如果發(fā)現(xiàn)為true則無需再走各種加鎖/解鎖流程。
輕量級(jí)鎖:
輕量級(jí)鎖是由偏向所升級(jí)來的,偏向鎖運(yùn)行在一個(gè)線程進(jìn)入同步塊的情況下,當(dāng)?shù)诙€(gè)線程加入鎖爭(zhēng)用的時(shí)候,偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖;
重量級(jí)鎖:
重量鎖在JVM中又叫對(duì)象監(jiān)視器(Monitor),它很像C中的Mutex,除了具備Mutex(0|1)互斥的功能,它還負(fù)責(zé)實(shí)現(xiàn)了Semaphore(信號(hào)量)的功能,也就是說它至少包含一個(gè)競(jìng)爭(zhēng)鎖的隊(duì)列,和一個(gè)信號(hào)阻塞隊(duì)列(wait隊(duì)列),前者負(fù)責(zé)做互斥,后一個(gè)用于做線程同步。
偏向鎖、輕量級(jí)鎖、重量級(jí)鎖的對(duì)比:
3.Redis和Memcache區(qū)別對(duì)比?如何選擇這兩個(gè)技術(shù)?
區(qū)別:
1)Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
2)Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
3)虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒用到的value交換到磁盤
4)過期策略--memcache在set時(shí)就指定,例如setkey1008,即永不過期。Redis可以通過例如expire設(shè)定,例如expirename10
5)分布式--設(shè)定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6)存儲(chǔ)數(shù)據(jù)安全--memcache掛掉后,數(shù)據(jù)沒了;redis可以定期保存到磁盤(持久化)
7)災(zāi)難恢復(fù)--memcache掛掉后,數(shù)據(jù)不可恢復(fù);redis數(shù)據(jù)丟失后可以通過aof恢復(fù)
8)Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
選型:
若是簡(jiǎn)單的存取key-value這樣的數(shù)據(jù)用memcache好一些
若是要支持?jǐn)?shù)據(jù)持久化,多數(shù)據(jù)類型(如集合、散列之類的),用列表類型做隊(duì)列之類的高級(jí)應(yīng)用,就用redis
4,Redis的持久化機(jī)制是什么?各自的優(yōu)缺點(diǎn)?
redis提供兩種持久化機(jī)制RDB和AOF機(jī)制。
1)RDB持久化方式:
是指用數(shù)據(jù)集快照的方式記錄redis數(shù)據(jù)庫的所有鍵值對(duì)。
優(yōu)點(diǎn):
- 只有一個(gè)文件dump.rdb,方便持久化。
- 容災(zāi)性好,一個(gè)文件可以保存到安全的磁盤。
- 性能最大化,fork子進(jìn)程來完成寫操作,讓主進(jìn)程繼續(xù)處理命令,所以是IO最大化。
- 相對(duì)于數(shù)據(jù)集大時(shí),比AOF的啟動(dòng)效率更高。
缺點(diǎn):
- 數(shù)據(jù)安全性低。
- AOF持久化方式:是指所有的命令行記錄以redis命令請(qǐng)求協(xié)議的格式保存為aof文件。
優(yōu)點(diǎn):
- 數(shù)據(jù)安全,aof持久化可以配置appendfsync屬性,有always,每進(jìn)行一次命令操作就記錄到aof文件中一次。
- 通過append模式寫文件,即使中途服務(wù)器宕機(jī),可以通過redis-check-aof工具解決數(shù)據(jù)一致性問題。
- AOF機(jī)制的rewrite模式。
缺點(diǎn):
- 文件會(huì)比RDB形式的文件大。
- 數(shù)據(jù)集大的時(shí)候,比rdb啟動(dòng)效率低。
5.Mysql的數(shù)據(jù)庫表鎖、行鎖、頁級(jí)鎖?
表級(jí),直接鎖定整張表,在你鎖定期間,其它進(jìn)程無法對(duì)該表進(jìn)行寫操作。如果你是寫鎖,則其它進(jìn)程則讀也不允許
行級(jí),,僅對(duì)指定的記錄進(jìn)行加鎖,這樣其它進(jìn)程還是可以對(duì)同一個(gè)表中的其它記錄進(jìn)行操作。
頁級(jí),表級(jí)鎖速度快,但沖突多,行級(jí)沖突少,但速度慢。所以取了折衷的頁級(jí),一次鎖定相鄰的一組記錄。
以上就是長沙牛耳教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“程序員Java經(jīng)典筆試題目分享”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java筆試題