JAVA開發(fā)中有哪些面試題及答案

本文小編為大家詳細(xì)介紹“JAVA開發(fā)中有哪些面試題及答案”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“JAVA開發(fā)中有哪些面試題及答案”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

創(chuàng)新互聯(lián)服務(wù)項目包括西疇網(wǎng)站建設(shè)、西疇網(wǎng)站制作、西疇網(wǎng)頁制作以及西疇網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西疇網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西疇省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

1、自我介紹、自己做的項目和技術(shù)領(lǐng)域

開放題

2、項目中的監(jiān)控:那個監(jiān)控指標(biāo)常見的有哪些?

答:CPU、內(nèi)存、IO 等等。建議下載個nmon工具,里面有各個指標(biāo)。

數(shù)據(jù)庫:MySQL(緩存命中、索引、單條SQL性能、數(shù)據(jù)庫線程數(shù)、數(shù)據(jù)池連接數(shù))

中間件:1.消息2、負(fù)載均衡3、緩存(包括線程數(shù)、連接數(shù)、日志)。

網(wǎng)絡(luò): 吞吐量、吞吐率

應(yīng)用: jvm內(nèi)存、日志、Full GC頻率

3、微服務(wù)涉及到的技術(shù)以及需要注意的問題有哪些?

4、注冊中心你了解了哪些?

答:Consul 、Eureka、ZooKeeper

5、consul 的可靠性你了解嗎?

6、consul 的機制你有沒有具體深入過?有沒有和其他的注冊中心對比過?

7、項目用 Spring 比較多,有沒有了解 Spring 的原理?AOP 和 IOC 的原理

答:(1). IoC(Inversion of Control)是指容器控制程序?qū)ο笾g的關(guān)系,而不是傳統(tǒng)實現(xiàn)中,由程序代碼直接操控??刂茩?quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移是所謂反轉(zhuǎn)。 對于Spring而言,就是由Spring來控制對象的生命周期和對象之間的關(guān)系;IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關(guān)系由容器在運行期決定,即由容器動態(tài)地將某種依賴關(guān)系注入到組件之中。

(2). 在Spring的工作方式中,所有的類都會在spring容器中登記,告訴spring這是個什么東西,你需要什么東西,然后spring會在系統(tǒng)運行到適當(dāng)?shù)臅r候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)。

(3). 在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象。

(4). 依賴注入的思想是通過反射機制實現(xiàn)的,在實例化一個類時,它通過反射調(diào)用類中set方法將事先保存在HashMap中的類屬性注入到類中。 總而言之,在傳統(tǒng)的對象創(chuàng)建方式中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例,而在Spring中創(chuàng)建被調(diào)用者的工作由Spring來完成,然后注入調(diào)用者,即所謂的依賴注入or控制反轉(zhuǎn)。 注入方式有兩種:依賴注入和設(shè)置注入; IoC的優(yōu)點:降低了組件之間的耦合,降低了業(yè)務(wù)對象之間替換的復(fù)雜性,使之能夠靈活的管理對象。

AOP(Aspect Oriented Programming)

(1). AOP面向方面編程基于IoC,是對OOP的有益補充;

(2). AOP利用一種稱為“橫切”的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了 多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的 邏輯或責(zé)任封裝起來,比如日志記錄,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。

(3). AOP代表的是一個橫向的關(guān) 系,將“對象”比作一個空心的圓柱體,其中封裝的是對象的屬性和行為;則面向方面編程的方法,就是將這個圓柱體以切面形式剖開,選擇性的提供業(yè)務(wù)邏輯。而 剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復(fù)原,不留痕跡,但完成了效果。

(4). 實現(xiàn)AOP的技術(shù),主要分為兩大類:一是采用動態(tài)代理技術(shù),利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執(zhí)行;二是采用靜態(tài)織入的方式,引入特定的語法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼。

(5). Spring實現(xiàn)AOP:JDK動態(tài)代理和CGLIB代理 JDK動態(tài)代理:其代理對象必須是某個接口的實現(xiàn),它是通過在運行期間創(chuàng)建一個接口的實現(xiàn)類來完成對目標(biāo)對象的代理;其核心的兩個類是InvocationHandler和Proxy。 CGLIB代理:實現(xiàn)原理類似于JDK動態(tài)代理,只是它在運行期間生成的代理對象是針對目標(biāo)類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節(jié)碼編輯類庫)操作字節(jié)碼實現(xiàn)的,性能比JDK強;需要引入包asm.jar和cglib.jar。 使用AspectJ注入式切面和@AspectJ注解驅(qū)的切面實際上底層也是通過動態(tài)代理實現(xiàn)的。

(6). AOP使用場景:

Authentication 權(quán)限檢查

Caching 緩存

Context passing 內(nèi)容傳遞

Error handling 錯誤處理

Lazy loading 延遲加載

Debugging 調(diào)試

logging, tracing, profiling and monitoring 日志記錄,跟蹤,優(yōu)化,校準(zhǔn)

Performance optimization 性能優(yōu)化,效率檢查

Persistence 持久化

Resource pooling 資源池

Synchronization 同步

Transactions 事務(wù)管理

另外Filter的實現(xiàn)和struts2的攔截器的實現(xiàn)都是AOP思想的體現(xiàn)。

8、Spring Boot除了自動配置,相比傳統(tǒng)的 Spring 有什么其他的區(qū)別?

為Spring 生態(tài)系統(tǒng)的開發(fā)提供一種更簡潔的方式,提供了很多非功能性特性,例如:嵌入式 Server,Security,統(tǒng)計,健康檢查,外部配置等等,主要體現(xiàn)在以下幾點:

1.Spring Boot可以建立獨立的Spring應(yīng)用程序;

2.內(nèi)嵌了如Tomcat,Jetty和Undertow這樣的容器,也就是說可以直接跑起來,用不著再做部署工作了;

3.無需再像Spring那樣搞一堆繁瑣的xml文件的配置;

4.可以自動配置Spring。SpringBoot將原有的XML配置改為Java配置,將bean注入改為使用注解注入的方式(@Autowire),并將多個xml、properties配置濃縮在一個appliaction.yml配置文件中。

5.提供了一些現(xiàn)有的功能,如量度工具,表單數(shù)據(jù)驗證以及一些外部配置這樣的一些第三方功能;

6.整合常用依賴(開發(fā)庫,例如spring-webmvc、jackson-json、validation-api和tomcat等),提供的POM可以簡化Maven的配置。當(dāng)我們引入核心依賴時,SpringBoot會自引入其他依賴。

9、Spring Cloud 有了解多少?

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用Spring Boot的開發(fā)風(fēng)格做到一鍵啟動和部署。Spring Cloud并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟、經(jīng)得起實際考驗的服務(wù)框架組合起來,通過Spring Boot風(fēng)格進行再封裝屏蔽掉了復(fù)雜的配置和實現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護的分布式系統(tǒng)開發(fā)工具包。

10、Spring Bean 的生命周期

一個Bean從創(chuàng)建到銷毀,如果是用BeanFactory來生成,管理Bean的話

Spring上下文中的Bean也類似,如下

1、實例化一個Bean--也就是我們常說的new;

2、按照Spring上下文對實例化的Bean進行配置--也就是IOC注入;

3、如果這個Bean已經(jīng)實現(xiàn)了BeanNameAware接口,會調(diào)用它實現(xiàn)的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值

4、如果這個Bean已經(jīng)實現(xiàn)了BeanFactoryAware接口,會調(diào)用它實現(xiàn)的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以);

5、如果這個Bean已經(jīng)實現(xiàn)了ApplicationContextAware接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現(xiàn)步驟4的內(nèi)容,但比4更好,因為ApplicationContext是BeanFactory的子接口,有更多的實現(xiàn)方法);

6、如果這個Bean關(guān)聯(lián)了BeanPostProcessor接口,將會調(diào)用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經(jīng)常被用作是Bean內(nèi)容的更改,并且由于這個是在Bean初始化結(jié)束時調(diào)用那個的方法,也可以被應(yīng)用于內(nèi)存或緩存技術(shù);

7、如果Bean在Spring配置文件中配置了init-method屬性會自動調(diào)用其配置的初始化方法。

8、如果這個Bean關(guān)聯(lián)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以應(yīng)用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們調(diào)用同一個id的Bean會是在內(nèi)容地址相同的實例,當(dāng)然在Spring配置文件中也可以配置非Singleton,這里我們不做贅述。

9、當(dāng)Bean不再需要時,會經(jīng)過清理階段,如果Bean實現(xiàn)了DisposableBean這個接口,會調(diào)用那個其實現(xiàn)的destroy()方法;

10、最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調(diào)用其配置的銷毀方法。

另外我們這里描述的是應(yīng)用Spring上下文Bean的生命周期,如果應(yīng)用Spring的工廠也就是BeanFactory的話去掉第5步就Ok了

11、HashMap 和 hashTable 區(qū)別?

區(qū)別:Hashtable是線程安全的,效率比較低

Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的注釋中有說明

Hashtable默認(rèn)的初始大小為11,之后每次擴充,容量變?yōu)樵瓉淼?n+1。

HashMap默認(rèn)的初始化大小為16。之后每次擴充,容量變?yōu)樵瓉淼?倍

Hashtable在計算元素的位置時需要進行一次除法運算,而除法運算是比較耗時的

HashMap為了提高計算效率,將哈希表的大小固定為了2的冪,這樣在取模預(yù)算時,不需要做除法,只需要做位運算。位運算比除法的效率要高很多。

HashMap是繼承自AbstractMap類,而HashTable是繼承自Dictionary類。不過它們都實現(xiàn)了同時實現(xiàn)了map、Cloneable(可復(fù)制)、Serializable(可序列化)這三個接口

12、Object 的 hashcode 方法重寫了,equals 方法要不要改?

不需要,Ojbect類中有兩個方法equals、hashCode,這兩個方法都是用來比較兩個對象是否相等的,如果兩個對象相等(equal),那么必須擁有相同 的哈希碼(hash code)

即使兩個對象有相同的哈希值(hash code),他們不一定相等

重寫equals()方法就必須重寫hashCode(),但重寫hashcode方法不一定要重寫equals方法

13、Hashmap 線程不安全的出現(xiàn)場景

用ConcurrentHashMap 線程安全

多線程處理時hashmap線程不安全

首先hashmap里這個size沒有用volatile關(guān)鍵字修飾,代表這不是一個內(nèi)存可見的變量,線程操作數(shù)據(jù)的時候一般是從主存拷貝一個變量副本進行操作,操作完成過后在把size的值寫回到主存size的

線程不安全問題應(yīng)該屬于并發(fā)問題之一的,屬于相對高級的問題了。這個時候的問題已經(jīng)不僅僅局限于代碼層面了,很多時候需要結(jié)合JVM一起分析了

14、線上服務(wù) CPU 很高該怎么做?有哪些措施可以找到問題

定位出現(xiàn)問題的堆棧信息排查具體問題

1、top命令:Linux命令??梢圆榭磳崟r的CPU使用情況。也可以查看最近一段時間的CPU使用情況。

2、ps命令: Linux命令。強大的進程狀態(tài)監(jiān)控命令??梢圆榭催M程以及進程中線程的當(dāng)前CPU使用情況。屬于當(dāng)前狀態(tài)的采樣數(shù)據(jù)。

3、jstack: Java提供的命令??梢圆榭茨硞€進程的當(dāng)前線程棧運行情況。根據(jù)這個命令的輸出可以定位某個進程的所有線程的當(dāng)前運行狀態(tài)、運行代碼,以及是否死鎖等等。

4、pstack:Linux命令??梢圆榭茨硞€進程的當(dāng)前線程棧運行情況

15、JDK 中有哪幾個線程池?順帶把線程池講了個遍

JUC提供了調(diào)度器對象Executors來創(chuàng)建線程池,可創(chuàng)建的線程池有四種

1、newFixedThreadPool創(chuàng)建一個指定工作線程數(shù)量的線程池。每當(dāng)提交一個任務(wù)就創(chuàng)建一個工作線程,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù),則將提交的任務(wù)存入到池隊列中。

2、newCachedThreadPool創(chuàng)建一個可緩存的線程池。這種類型的線程池特點是:

1).工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實也有限制的,數(shù)目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。

2).如果長時間沒有往線程池中提交任務(wù),即如果工作線程空閑了指定的時間(默認(rèn)為1分鐘),則該工作線程將自動終止。終止后,如果你又提交了新的任務(wù),則線程池重新創(chuàng)建一個工作線程。

3、newSingleThreadExecutor創(chuàng)建一個單線程化的Executor,即只創(chuàng)建唯一的工作者線程來執(zhí)行任務(wù),如果這個線程異常結(jié)束,會有另一個取代它,保證順序執(zhí)行(我覺得這點是它的特色)。單工作線程最大的特點是可保證順序地執(zhí)行各個任務(wù),并且在任意給定的時間不會有多個線程是活動的 。

4、newScheduleThreadPool創(chuàng)建一個定長的線程池,而且支持定時的以及周期性的任務(wù)執(zhí)行,類似于Timer。(這種線程池原理暫還沒完全了解透徹)

15、SQL 優(yōu)化的常見方法有哪些

查詢條件減少使用函數(shù),避免全表掃描

減少不必要的表連接

有些數(shù)據(jù)操作的業(yè)務(wù)邏輯可以放到應(yīng)用層進行實現(xiàn)

可以使用with as

盡量避免使用游標(biāo),因為游標(biāo)的效率較差

不要把SQL語句寫得太復(fù)雜

不能循環(huán)執(zhí)行查詢

用 exists 代替 in

表關(guān)聯(lián)關(guān)系不要太糾結(jié)

查詢多用索引列取查,用charindex或者like[0-9]來代替%%

inner關(guān)聯(lián)的表可以先查出來,再去關(guān)聯(lián)leftjoin的表

可以進行表關(guān)聯(lián)數(shù)據(jù)拆分,即先查出核心數(shù)據(jù),再通過核心數(shù)據(jù)查其他數(shù)據(jù),這樣會快得多

參考SQL執(zhí)行順序進行優(yōu)化

表關(guān)聯(lián)時取別名,也能提高效率

使用視圖,給視圖建立索引進行優(yōu)化

使用數(shù)據(jù)倉庫的形式,建立單獨的表存儲數(shù)據(jù),根據(jù)時間戳定期更新數(shù)據(jù)。將多表關(guān)聯(lián)的數(shù)據(jù)集中抽取存入一張表中,查詢時單表查詢,提高了查詢效率

對查詢進行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引

應(yīng)盡量避免在 where 子句中對字段進行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:

select id from t where num=0

16.應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描

17、SQL 索引的順序,字段的順序

18、查看 SQL 是不是使用了索引?(有什么工具)

在select語句前加上EXPLAIN即可

19、TCP 和 UDP 的區(qū)別?TCP 數(shù)據(jù)傳輸過程中怎么做到可靠的?

UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應(yīng)的協(xié)議。它是屬于TCP/IP協(xié)議族中的一種

1)為了保證數(shù)據(jù)包的可靠傳遞,發(fā)送方必須把已發(fā)送的數(shù)據(jù)包保留在緩沖區(qū);

(2)并為每個已發(fā)送的數(shù)據(jù)包啟動一個超時定時器;

(3)如在定時器超時之前收到了對方發(fā)來的應(yīng)答信息(可能是對本包的應(yīng)答,也可以是對本包后續(xù)包的應(yīng)答),則釋放該數(shù)據(jù)包占用的緩沖區(qū);

(4)否則,重傳該數(shù)據(jù)包,直到收到應(yīng)答或重傳次數(shù)超過規(guī)定的最大次數(shù)為止。

(5)接收方收到數(shù)據(jù)包后,先進行CRC校驗,如果正確則把數(shù)據(jù)交給上層協(xié)議,然后給發(fā)送方發(fā)送一個累計應(yīng)答包,表明該數(shù)據(jù)已收到,如果接收方正好也有數(shù)據(jù)要發(fā)給發(fā)送方,應(yīng)答包也可方在數(shù)據(jù)包中捎帶過去。

20、說下你知道的排序算法吧

常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等

21、查找一個數(shù)組的中位數(shù)?

通過二分查找法來找中位數(shù)

基本思想是:假設(shè)ar1[i]是合并后的中位數(shù),那么ar1[i]大于ar1[]中前i-1個數(shù),且大于ar2[]中前j=n-i-1個數(shù)。通過ar1[i]和ar2[j]、ar2[j+1]兩個數(shù)的比較,在ar1[i]的左邊或者ar1[i]右邊繼續(xù)進行二分查找。對于兩個數(shù)組 ar1[] 和ar2[], 先在 ar1[] 中做二分查找。如果在ar1[]中沒找到中位數(shù), 繼續(xù)在ar2[]中查找。

算法流程:

1) 得到數(shù)組ar1[]最中間的數(shù),假設(shè)下標(biāo)為i.

2) 計算對應(yīng)在數(shù)組ar2[]的下標(biāo)j,j = n-i-1

3) 如果 ar1[i] >= ar2[j] and ar1[i] <= ar2[j+1],那么 ar1[i] 和 ar2[j] 就是兩個中間元素,返回ar2[j] 和 ar1[i] 的平均值

4) 如果 ar1[i] 大于 ar2[j] 和 ar2[j+1] 那么在ar1[i]的左部分做二分查找(i.e., arr[left ... i-1])

5) 如果 ar1[i] 小于 ar2[j] 和 ar2[j+1] 那么在ar1[i]的右部分做二分查找(i.e., arr[i+1....right])

6) 如果到達(dá)數(shù)組ar1[]的邊界(left or right),則在數(shù)組ar2[]中做二分查找

時間復(fù)雜度:O(logn)。

讀到這里,這篇“JAVA開發(fā)中有哪些面試題及答案”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:JAVA開發(fā)中有哪些面試題及答案
網(wǎng)站URL:http://muchs.cn/article44/gphshe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)企業(yè)網(wǎng)站制作、網(wǎng)站營銷、網(wǎng)站設(shè)計公司、微信公眾號、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)