201902-Java面试总结
最近兩周都在面試,很多技術點都知道,但是很少實戰(zhàn)應用,面試的時候描述就自然模糊不清,所以現在就兩周面試個人情況總結如下(其實還是個人java基礎知識需要鞏固理解學習,加油ing):
- java Object的方法有哪些?
-
1.clone方法:保護方法,實現對象的淺復制,只有實現了Cloneable接口才可以調用該方法,否則拋出CloneNotSupportedException異常。主要是JAVA里除了8種基本類型傳參數是值傳遞,其他的類對象傳參數都是引用傳遞,我們有時候不希望在方法里將參數改變,這時就需要在類中復寫clone方法。
2.getClass方法:final方法,獲得運行時類型。
3.toString方法:該方法用得比較多,一般子類都有覆蓋。(雖然Object提供了toString的實現,但它返回的是類名+@+哈希碼值的無符號16進制表示=>getClass().getName() + '@' + Integer.toHexString(hashCode()) =>通常,toString?方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易于讀懂的信息表達式。所以,建議所有子類都重寫此方法。)
4.finalize方法:該方法用于釋放資源。因為無法確定該方法什么時候被調用,很少使用。
5.equals方法:該方法是非常重要的一個方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個方法。
6.hashCode方法:該方法用于哈希查找,可以減少在查找中使用equals的次數,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到。一般必須滿足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應該盡量使上面兩個條件接近等價。如果不重寫hashcode(),在HashSet中添加兩個equals的對象,會將兩個對象都加入進去。
-
7.wait方法:wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。
8.notify方法:該方法喚醒在該對象上等待的某個線程。
9.notifyAll方法:該方法喚醒在該對象上等待的所有線程。
- java的反射機制是什么?原理是什么?
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為java語言的反射機制。
延伸參考:https://blog.csdn.net/Appleyk/article/details/77879073
- java Interface接口和Abstract抽象類的區(qū)別?它們分別使用的場景?
抽象類與接口都用于抽象,但抽象類(單繼承)可以有自己的部分實現,而接口(多繼承)則完全是一個標識;
接口的好處是將實現(細節(jié))與表現(動作)分離;
- java 悲觀鎖和樂觀鎖是什么?java中有哪些鎖?
樂觀鎖:樂觀并發(fā)控制(又名”樂觀鎖”,Optimistic Concurrency Control,縮寫”O(jiān)CC”)是一種并發(fā)控制的方法。它假設多用戶并發(fā)的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的 那部分數據。在提交數據更新之前,每個事務會先檢查在該事務讀取數據后,有沒有其他事務又修改了該數據。如果其他事務有更新的話,正在提交的事務會進行回 滾。樂觀事務控制最早是由孔祥重(H.T.Kung)教授提出。
實現:樂觀鎖一般會使用版本號機制或CAS(Compare-and-Swap,即比較并替換)算法實現。
悲觀鎖:悲觀并發(fā)控制(又名”悲觀鎖”,Pessimistic Concurrency Control,縮寫”PCC”)是一種并發(fā)控制的方法。它可以阻止一個事務以影響其他用戶的方式來修改數據。如果一個事務執(zhí)行的操作讀某行數據應用了 鎖,那只有當這個事務把鎖釋放,其他事務才能夠執(zhí)行與該鎖沖突的操作。
實現:Java中synchronized和ReentrantLock等獨占鎖就是悲觀鎖思想的實現。
兩種鎖的使用場景:兩種鎖各有優(yōu)缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果是多寫的情況,一般會經常產生沖突,這就會導致上層應用會不斷的進行retry,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適。
延伸參考:https://www.cnblogs.com/qlqwjy/p/7798266.html
java的鎖有哪些?
? ? ? ? ? 【1】公平鎖和非公平鎖。?
? ? ? ? ? 公平鎖:是指按照申請鎖的順序來獲取鎖,?
? ? ? ? ? 非公平鎖:線程獲取鎖的順序不一定按照申請鎖的順序來的。
? ? ? ? ? //默認是不公平鎖,傳入true為公平鎖,否則為非公平鎖
? ? ? ? ? ReentrantLock reentrantLock = ?new ReetrantLock();
? ? ? ? ? 【2】共享鎖和獨享鎖?
? ? ? ? ? 獨享鎖:一次只能被一個線程所訪問?
? ? ? ? ? 共享鎖:線程可以被多個線程所持有。?
? ? ? ? ? ReadWriteLock 讀鎖是共享鎖,寫鎖是獨享鎖。?
? ? ? ? ? 【3】樂觀鎖和悲觀鎖。?
? ? ? ? ? 樂觀鎖:對于一個數據的操作并發(fā),是不會發(fā)生修改的。在更新數據的時候,會嘗試采用更新,不斷重入的方式,更新數據。?
? ? ? ? ? 悲觀鎖:對于同一個數據的并發(fā)操作,是一定會發(fā)生修改的。因此對于同一個數據的并發(fā)操作,悲觀鎖采用加鎖的形式。悲觀鎖認為,不加鎖的操作一定會出問題,?
? ? ? ? ? 【4】分段鎖:其實是一種鎖的設計,并不是具體的一種鎖,對于ConcurrentHashMap而言,其并發(fā)的實現就是通過分段鎖的形式來實現高效的并發(fā)操作。其思想就是讓鎖的粒度變小。?
? ? ? ? ? 【5】這三種鎖是指鎖的狀態(tài),并且是針對Synchronized。
? ? ? ? ? 偏向鎖:是指一段同步代碼一直被一個線程所訪問,那么該線程會自動獲取鎖。降低獲取鎖的代價?
? ? ? ? ? 輕量級鎖 :指當鎖是偏向鎖的時候,被另一個線程所訪問,偏向鎖就會升級為輕量級鎖,其他線程會通過自旋的形式嘗試獲取鎖,不會阻塞,提高性能。
? ? ? ? ? 重量級鎖 :指當鎖為輕量級鎖的時候,另一個線程雖然是自旋,但自旋不會一直持續(xù)下去,當自旋一定次數的時候,還沒有獲取到鎖,就會進入阻塞,該鎖膨脹為重量級鎖。重量級鎖會讓其他申請的線程進入阻塞,性能降低。
? ? ? ? ? 【6】自旋鎖:指嘗試獲取鎖的線程不會立即阻塞,而是采用循環(huán)的方式去嘗試獲取鎖,這樣的好處是減少線程上下文切換的消耗,缺點是循環(huán)會消耗CPU。
延伸閱讀:http://www.cnblogs.com/lxmyhappy/p/7380073.html
- java事務處理,有哪些事務?
java的事務處理,如果對數據庫進行多次操作,每一次的執(zhí)行或步驟都是一個事務.如果數據庫操作在某一步沒有執(zhí)行或出現異常而導致事務失敗,這樣有的事務被執(zhí)行有的就沒有被執(zhí)行,從而就有了事務的回滾,取消先前的操作.....?
Java事務的類型有三種:JDBC事務、JTA(JavaTransaction API)事務、容器事務。
1、JDBC事務:控制的局限性在一個數據庫連接內,但是其使用簡單。
2、JTA事務:功能強大,事務可以跨越多個數據庫或多個DAO,使用也比較復雜。
3、容器事務:主要指的是J2EE應用服務器提供的事務管理,局限于EJB應用使用。
JDBC 事務是用 Connection 對象控制的。JDBCConnection 接口( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。 java.sql.Connection 提供了以下控制事務的方法:public void setAutoCommit(boolean),public boolean getAutoCommit(),public void commit(),public void rollback();使用 JDBC 事務界定時,您可以將多個 SQL 語句結合到一個事務中。JDBC 事務的一個缺點是事務的范圍局限于一個數據庫連接。一個 JDBC 事務不能跨越多個數據庫
延伸閱讀:https://www.cnblogs.com/wang-Java-begining/p/9978230.html
https://www.cnblogs.com/Bonker/p/5417967.html
https://jingyan.baidu.com/article/414eccf65aa5896b421f0a52.html? (百度經驗-簡單)
- java數據庫事務的原則(特性)有哪些?(ACID原則)
數據庫事務正確執(zhí)行的四個原則:A (Atomicity)原子性、C (Consistency) 一致性、I(Isolation)隔離性、D(Durability)持久性
1、A (Atomicity) 原子性 :事務里的所有操作要么全部做完,要么都不做,事務成功的條件是事務里的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾(要么成功,要么失敗重來)。 比如銀行轉賬,從A賬戶轉100元至B賬戶,分為兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。
2、C (Consistency) 一致性 :數據庫要一直處于一致的狀態(tài),事務的運行不會改變數據庫原本的一致性約束。 例如現有完整性約束a存款+b存款=2000,如果一個事務改變了a存款,那么必須得改變b存款,使得事務結束后依然滿足a存款+b存款=2000,否則事務失敗。
3、I (Isolation) 隔離性:指并發(fā)的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。 比如現在有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的。
即要達到這么一種效果:對于任意兩個并發(fā)的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發(fā)地執(zhí)行。(串行化)
4、D (Durability) 持久性 :指一旦事務提交后,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。
- @transaction注解的參數有哪些,作用是什么?
延伸閱讀:https://www.cnblogs.com/alice-cj/p/10417097.html? (very good)?
https://www.cnblogs.com/sonng/p/6591319.html? ?(good)
- java有哪些常見 的設計模式?(23種)
單例模式可以分為懶漢式和餓漢式:
1)懶漢式單例模式:在類加載時不初始化。
2)餓漢式單例模式:在類加載時就完成了初始化,所以類加載比較慢,但獲取對象的速度快。
懶漢式,線程安全;餓漢式,線程不安全;使用靜態(tài)內部類?|?枚舉方式?|?雙重校驗鎖,線程安全【推薦】
延伸閱讀:https://blog.csdn.net/a214024475/article/details/53188472
https://wangle.iteye.com/blog/196972https://wangle.iteye.com/blog/196972
https://blog.csdn.net/qq_21439971/article/details/53740109? ? (單例模式)
- spring的核心是什么,特性有哪些?AOP,IOC底層實現的原理是什么?
spring是一個輕型容器(light-weight Container),其核心是Bean工廠(Bean Factory),用以構造我們所需要的M(Model)
兩個特性:IoC(Inversion of Control 控制反轉)/ DI (Dependency Injection依賴注入)和面向切面編程(aspect-oriented programming,AOP)
IOC(控制反轉):?就是把要在程序中實例化的對象配置到文件中,在程序中不用new來產生,而是讓容器通過配置文件返回一個給你,好處就是當需要更改業(yè)務邏輯時,方便替換對接口的不同實現類。通俗理解:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。針對一個接口,我們可能會寫多個實現類,如果在代碼中、程序中對實現類的對象進行創(chuàng)建,當想更換實現類時(使用其他的實現類),就需要對代碼進行更改。
AOP(面向切面編程):通過預編譯方式和運行期動態(tài)代理實現在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加功能的一種技術。將日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等代碼從業(yè)務邏輯代碼中劃分出來。基本實現就是對相關的方法進行攔截,添加所需的處理動作。
Spring有兩種不同的容器:
Bean工廠(org.springframework.beans.factory.BeanFactory)是最簡單的容器(是Spring基本的IOC容器),提供了基礎的依賴注入支持
應用上下文(org.springframework.context.ApplicationContext)建立在Bean工廠基礎之上,提供了系統(tǒng)構架服務
參考閱讀:https://blog.csdn.net/yks0527/article/details/54093490
- 常見的排序算法有哪些?復雜度O(n)的排序算法?
延伸閱讀:https://www.cnblogs.com/guoyaohua/p/8600214.html
- Solr,mongoDB,redis,zookeeper,Hadoop是什么框架?分別適合什么場景使用?
Solr:是一個獨立的企業(yè)級搜索應用服務器,是一款非常優(yōu)秀的全文搜索引擎,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結果。它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結果,通過索引復制來提高可用性,提供一套強大Data Schema來定義字段,類型和設置文本分析,提供基于Web的管理界面等。
MongoDB是一個基于分布式文件存儲的數據庫。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它的特點是高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:*面向集合存儲,易存儲對象類型的數據。*模式自由。*支持動態(tài)查詢。*支持完全索引,包含內部對象。*支持查詢。*支持復制和故障恢復。*使用高效的二進制數據存儲,包括大型對象(如視頻等)。*自動處理碎片,以支持云計算層次的擴展性。*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。*文件存儲格式為BSON(一種JSON的擴展)。*可通過網絡訪問。所謂“面向集合”(Collection-Oriented),意思是數據被分組存儲在數據集中,被稱為一個集合(Collection)。MongoDB已經在多個站點部署,主要適用場景:1)網站實時數據處理。它非常適合實時的插入、更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性。2)緩存。由于性能很高,它適合作為信息基礎設施的緩存層。在系統(tǒng)重啟之后,由它搭建的持久化緩存層可以避免下層的數據源過載。3)高伸縮性的場景。非常適合由數十或數百臺服務器組成的數據庫,它的路線圖中已經包含對MapReduce引擎的內置支持。不適用場景:1)要求高度事務性的系統(tǒng)。2)傳統(tǒng)的商業(yè)智能應用。3)復雜的跨文檔(表)級聯(lián)查詢。
Redis:是一個開源的使用ANSI?C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區(qū)別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。redis使用了兩種文件格式:全量數據和增量請求。適用場景:1)配合關系型數據庫做高速緩存,;)緩存高頻次訪問的數據,降低數據庫io;3)分布式架構,做session共享;4)可以持久化特定數據;5)利用zset類型可以存儲排行榜;6)利用list的自然時間排序存儲最新n個數據;數據高并發(fā)的讀寫,海量數據的讀寫,對擴展性要求高的數據;不適場景:需要事務支持(非關系型數據庫)基于sql結構化查詢儲存,關系復雜。參考延伸:https://www.cnblogs.com/xiaoxi/p/7007695.html
ZooKeeper:是一個分布式的,開放源碼的分布式應用程序協(xié)調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。
Hadoop:實現了一個分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)文件系統(tǒng)中的數據。框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數據提供了存儲,而MapReduce則為海量的數據提供了計算。
Hadoop是一個能夠讓用戶輕松架構和使用的分布式計算平臺。用戶可以輕松地在Hadoop上開發(fā)和運行處理海量數據的應用程序。它主要有以下幾個優(yōu)點:
- 索引的數據結構是什么?
B-樹(B-tree),散列(Hash),k-d 樹(k-d tree),點四叉樹(Point Quadtree)
1.什么是索引:索引是建立在表的一列或多個列上的輔助對象,目的是加快訪問表中的數據;
Oracle存儲索引的數據結構是B*樹(平衡樹),位圖索引也是如此,只不過是葉子節(jié)點不同B*數索引;
索引由根節(jié)點、分支節(jié)點和葉子節(jié)點組成,上級索引塊包含下級索引塊的索引數據,葉節(jié)點包含索引數據和確定行實際位置的rowid。
2.使用索引的目的:1)加快查詢速度;2)減少I/O操作;3)消除磁盤排序(索引能加快排序速度)
3.何時使用索引:查詢返回的記錄數?? 排序表<40%???? ,對非排序表?<7%, 表的碎片較多(頻繁增加、刪除)
4.索引的種類:非唯一索引(最常用),唯一索引,位圖索引,局部有前綴分區(qū)索引,局部無前綴分區(qū)索引,全局有前綴分區(qū)索引
,散列分區(qū)索引,基于函數的索引
參考閱讀:https://blog.csdn.net/w1014074794/article/details/48810805
https://www.cnblogs.com/liuning8023/archive/2012/11/15/2728536.html
- spring boot 自動配置的原理是什么?什么場景適合用spring boot?
SpringBoot 自動配置主要通過?@EnableAutoConfiguration,?@Conditional,?@EnableConfigurationProperties?或者?@ConfigurationProperties?等幾個注解來進行自動配置完成的。
@EnableAutoConfiguration?開啟自動配置,主要作用就是調用?Spring-Core?包里的?loadFactoryNames(),將?autoconfig?包里的已經寫好的自動配置加載進來。
@Conditional?條件注解,通過判斷類路徑下有沒有相應配置的?jar?包來確定是否加載和自動配置這個類。
@EnableConfigurationProperties?的作用就是,給自動配置提供具體的配置參數,只需要寫在?application.properties?中,就可以通過映射寫入配置類的?POJO?屬性中。
在微服務概念興起的今天,很多公司轉型使用微服務作為架構。在技術選型上Spring Cloud 是非常好的選擇,它提供了一站式的分布式系統(tǒng)解決方案,而Spring Cloud中的每個組件都是基于Spring Boot構建的,Spring Boot提供J2EE一站式解決方案,具有以下優(yōu)點:
參考閱讀:https://www.cnblogs.com/leihuazhe/p/7743479.html
https://www.cnblogs.com/jiadp/p/9276826.html
- spring cloud是什么?它的作用和底層實現原理是什么?什么場景適合用spring cloud?
spring cloud 是基于spring boot實現的微服務架構開發(fā)工具,他為微服務中設計的配置管理、服務治理、斷路器、智能路由、微代理、控制總線、全局鎖、決策精選、分布式會話和集群狀態(tài)管理等操作提供了一套簡單的開發(fā)方式。?
參考延伸:https://www.cnblogs.com/sessionbest/p/9396728.html? ?(圖解)
https://blog.csdn.net/Shinlyzsljay/article/details/79162270
https://blog.csdn.net/lchq1995/article/details/84234958
Ribbon:客戶端負載均衡,重試機制。
Hystrix:客戶端容錯保護,服務熔斷、請求緩存、請求合并、依賴隔離。
Feign:聲明式服務調用,本質上就是Ribbon+Hystrix(優(yōu)化代碼,避免直接使用RestTemplate的混亂)
Bus:消息總線,配合Config倉庫修改的一種Stream實現,獨自啟動不需要依賴其它組件。
Eureka:服務注冊中心,特性有失效剔除、服務保護。
Dashboard,Hystrix:儀表盤,監(jiān)控集群模式和單點模式,其中集群模式需要收集器Turbine配合。
Zuul:API服務網關,功能有路由分發(fā)和過濾。
還有其它服務空間,包括configuration等等
?延伸閱讀:https://www.iteye.com/news/32734? ? (從架構演進的角度聊聊 Spring Cloud 都做了些什么?)
- java json遍歷的算法?
延伸參考:https://blog.csdn.net/qq_35893120/article/details/84288551
- java集合類
ArrayList:底層以數組的方式實現
LinkedList:底層采用雙鏈表的方式實現,都實現了List接口
延伸鏈接:https://blog.csdn.net/bjzhuhehe/article/details/72230559
HashMap和Hashtable都實現了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。HashMap幾乎可以等價于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。
數組:存儲區(qū)間連續(xù),占用內存嚴重,尋址容易,插入刪除困難;?
鏈表:存儲區(qū)間離散,占用內存比較寬松,尋址困難,插入刪除容易;
- java遍歷Map的方式有哪些?(四種遍歷map的方式)
?
?
總結
以上是生活随笔為你收集整理的201902-Java面试总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#textBox控件保留上次输入
- 下一篇: python爬取微博评论数据的githu