java工程師大型企業(yè)常見面試題總結(jié)1_第1頁
java工程師大型企業(yè)常見面試題總結(jié)1_第2頁
java工程師大型企業(yè)常見面試題總結(jié)1_第3頁
java工程師大型企業(yè)常見面試題總結(jié)1_第4頁
java工程師大型企業(yè)常見面試題總結(jié)1_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

企業(yè)面試總結(jié)

經(jīng)過一星期的緊張面試,獲得了許多的面試經(jīng)驗,總結(jié)了面

試中遇到的問題J現(xiàn)對一些主要問題進(jìn)行總結(jié),希望能給大

家以幫助。

非項目方面

1.redis內(nèi)存溢出及宕機(jī)狀態(tài)的處理

?redis存在于內(nèi)存中,內(nèi)存大小有限,也會存在宕機(jī)或重啟導(dǎo)致內(nèi)存數(shù)據(jù)清空的情況,此

時我們可通過對redis中的數(shù)據(jù)設(shè)置生存周期及對數(shù)據(jù)進(jìn)行持久化操作來盡量避免這些

情況帶來的危害。

設(shè)置生命周期:到期后數(shù)據(jù)銷毀

EXPIREkeyseconds設(shè)置生存時間

PERSISTkey清除生命時間(重新設(shè)值也會清除生命周期)

TTLkey查看剩余生存時間

TTL返回值:

大于0的數(shù)字:剩余生存時間,單位為秒i

-1:沒有生存時間,永久存儲

-2:數(shù)據(jù)己經(jīng)被刪除

持久化:是把數(shù)據(jù)從內(nèi)存以某種形式持久化到磁盤上。

持久化方式:RDB(relationaldatabase)和AOF(appendonlymode)

RDB:

通過快照方式實現(xiàn),當(dāng)符合條件時就對內(nèi)存數(shù)據(jù)進(jìn)行快照并存儲到硬盤上??煺盏臈l件在配

置文件中配置。由2個參數(shù)構(gòu)成,時間和改動的鍵的個數(shù)。

在配置文件中已經(jīng)預(yù)置了3個條件:

save9001#15分鐘內(nèi)有至少1個鍵被更改則進(jìn)行快照

save30010#5分鐘內(nèi)至少有10個鍵被更改則進(jìn)行快照

save6010000#1分鐘內(nèi)至少有10000個鍵被更改則進(jìn)行快照

以上條件之間是“或”的關(guān)系。

快照過程:

使用fork函數(shù)復(fù)制一份當(dāng)前進(jìn)程(父進(jìn)程)的副本(子進(jìn)程),然后父進(jìn)程繼續(xù)處理任務(wù),子

進(jìn)程則執(zhí)行寫入磁盤操作,寫入完成后再用臨時文件替舊的RDB文件。

可以通過SAVE和BGSAVE命令來手動快照,兩個命令的區(qū)別是前者是由主

進(jìn)程進(jìn)行快照,會阻塞其他請求,后者是通過fork子進(jìn)程快照操作。

注意:由于Redis使用fork來復(fù)制一份當(dāng)前進(jìn)程,那么子進(jìn)程就會占有和主

進(jìn)程一樣的內(nèi)存資源.比如說主進(jìn)程8G內(nèi)存,那么在備份的時候必須保證

有16G的內(nèi)存,要不然會信用虛擬內(nèi)存,性能韭常惹.___________________

AOF:

是將redis的每一條命令進(jìn)行記錄,并保存到磁盤的AOF文件中,重啟后會執(zhí)行該文件進(jìn)行

數(shù)據(jù)恢更,需要手動開啟。

appendonlyno|^開啟的,yes開啟,n。關(guān)閉

#Thenameoftheappend0nlyfile(default:nappendonly.aof")

#appendfilenameappendonly?aof

開啟后要指定aof文件,去掉#號注釋

優(yōu)化:aof會記錄每一條命令,包括一條數(shù)據(jù)的多次操作,這樣造成了冗余??墒褂?/p>

BGREWRITEAOF技術(shù)來進(jìn)行重寫,去除數(shù)據(jù)的中間執(zhí)行過程,保留最終數(shù)據(jù)命令即可。重寫

的策略是當(dāng)aof文件的大小超過上一次大小的某個比例時就會進(jìn)行重寫。

2.問題:文件是先寫入緩存的,而緩存讀取到硬盤需要時間,

假設(shè)在這個時間數(shù)據(jù)丟失那也會導(dǎo)致數(shù)據(jù)的丟失。所以即

使每秒做文件同步也可能導(dǎo)致數(shù)據(jù)丟失。

3.Spring注解開發(fā)的配置

此處會讓你說出幾個常用注解,說幾個就行。有時還會問你注解底層怎么實現(xiàn)就說不太了解。

在xml配置文件中開啟注解功能

<!--base-package:注解寫在哪個包-->

<rnntpxt:rnmponpnt-<;ranha<;p-parkagp="rn.i.hpan**/>

@Component(value="名稱")利用構(gòu)造方法創(chuàng)建對象

@Scope(value="singleton/prototype")單例和多例

@Lazy(value=true/false)延遲創(chuàng)建問題

@PostConstruct指定方法為初始化方法

@PreDestory指定方法為銷毀方法

@Autowired注入引用類型,只能按照類型進(jìn)行匹配

@Resource注入引用類型,如果有name屬性值,則按照bean的名稱進(jìn)行匹配;如果

沒有name屬性值,則按照類型進(jìn)行類型匹配

4.數(shù)據(jù)庫優(yōu)化

此處重點是數(shù)據(jù)庫的索引問題,索引可大大提高查詢效率,但是大數(shù)據(jù)量時也會影響效率。

此時他還會問你當(dāng)數(shù)據(jù)量很大時索引不行了該怎么處理,就回答讀寫分離,分庫分表。提前

對這兩塊做下了解,看看京東淘寶的處理方式。

索引存儲的值按索引列中的順序排列??梢岳肂-Tree索引進(jìn)行全關(guān)鍵字、關(guān)鍵字范圍和

關(guān)鍵字前綴查詢。

1.數(shù)據(jù)庫優(yōu)化

?sql級別的優(yōu)化

sql語句的書寫方式對效率也是有一定影響的。

1)使用>=替代〉

select*fromempwheredeptno>=10(效率高,因為depto直接定位到10,效率高)

2)select*fromempwheredeptno〉9(先定位到9,然后還要排除9,效率低)

如果使用union或者unionall了,此時如果不需要考慮去掉重復(fù)的數(shù)據(jù),盡量不要使用union,

因為union默認(rèn)是去重復(fù)的,去重復(fù)過程,也會影響效率。

對groupby子句的優(yōu)化上面:盡量在groupby前面將數(shù)據(jù)過濾掉。

selectjob,avg(sal)fromempwherejob='CLERK'groupbyjob(效率高)

selectjob,avg(sal)fromempgroupbyjobhavingjob='CLERK'(效率低)

使用視圖:(數(shù)據(jù)量非常大的情況下)

?經(jīng)常被查詢的列數(shù)據(jù),并且這些數(shù)據(jù)不被經(jīng)常的修改,刪除。

?數(shù)據(jù)表建立索引

索引是快速搜索的關(guān)鍵。MySQL索引的建立對于MySQL的高效運行是很重要的。索引分單

列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但

這不是組合索引。組合索引,即一個索包含多個列。

MySQL索引類型包括:

普通索引:這是最基本的索引,它沒有任何限制。

唯一索引:它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。

如果是組合索引,則列值的組合必須唯一。

主鍵索引:它是一種特殊的唯一索引,不允許有空值。

組合索引:將多個字段建到一個索引里。有個“最左前綴”的結(jié)果。

建立索引的時機(jī):

一般來說,在WHERE和JOIN中出現(xiàn)的列需要建立索引,但也不完全如此,因為MySQL只對

<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。在以通配符%和_開頭作查

詢時,MySQL不會使用索引。

SELECT*FROMmytableWHEREusernamelike'admin%'而下句就不會使用:

SELECT*FROMmytableWHEREtNamelike'%admin'

缺點:

提高了查詢速度,但降低了更新速度。因為更新時要額外保存索引文件。

索引文件在大數(shù)據(jù)量時會膨脹很快。

所以如果你的MySQL有大數(shù)據(jù)量的表,就需要花時間研究建立最優(yōu)秀的索引,或優(yōu)化查詢

語句。

1)使用索引的技巧和注意事項:

1.1個生產(chǎn)者,多個消費者

2.每一個消費者都有自己的一個隊列

3、生產(chǎn)者沒有將消息直接發(fā)送到隊列,而是發(fā)送到了交換機(jī)

4.每個隊列都要綁定到交換機(jī)

4、5.生產(chǎn)者發(fā)送的消息,經(jīng)過交換機(jī),到達(dá)隊列,實現(xiàn),一個消息被多個消費者獲取的目的

5、注意:消息發(fā)送到?jīng)]有隊列綁定的交換機(jī)時,消息將丟失,因為,交換機(jī)沒有存儲消息的

能力,消息只能存在在隊列中。

6、路由模式

amqp.gen-S9b...

生產(chǎn)者為消息指定類型,路由綁定不同的隊列,隊列指定接收的類型,只有類型匹配隊列才

接收。

TopicExchang?-將路由批和某鎮(zhèn)式進(jìn)行礎(chǔ)。此時從效需要烏淀要一1、根式上[符號?■?畸一個或多個詞,符號…陶不多不少一個詞,aH:audit桁能婚陪

到-auditMscorporate'但是.31期一只會工配到找在RcdHal的朋友M*T一舞不錯的翅,朱寰明空山娘JU何工作的:

模式1:自動確認(rèn)

只要消息從隊列中獲取,無論消費者獲取到消息后是否成功消息,都認(rèn)為是消息已經(jīng)成

功消費。

模式2:手動確認(rèn)

消費者從隊列中獲取消息后,服務(wù)指會將該消息標(biāo)記為不可用狀態(tài),等待消費者的反饋,

如果消費者一直沒有反饋,那么該消息將一直處于不可用狀態(tài)。

6.Spring的IOC和AOP的底層實現(xiàn)

IOC底層:工廠設(shè)計模式+XML技術(shù)+反射配置

7.AOP底層:動態(tài)代理

8.SSH中單例多例問題

三層結(jié)構(gòu)各用的是單例還是多例,為什么,action層是單例還是多例,什么時候用多例。

單例多例主要看該層有沒有定義成員變最,定義了成員變顯的話由于存在多線程的共同調(diào)

用相同變量所以要設(shè)置為多例。

scope屬性:bean的生命周期

singleton:單例(默認(rèn)值)(在初始化配置文件的時候創(chuàng)建的對象,不是getBean。)

prototype:多例(在getBean()的時候創(chuàng)建對象)

<beanid="s5"class="cn.itcast.bean.Student"scope="singleton"x/bean>

<beanid="s5"class="cn.itcast.bean.Student"scope="prototype"x/bean>

結(jié)合項目中使用場景:

分層開發(fā)的時候:

dao對象:單例

biz對象:單例

action對象:必須多例的(屬性或模型驅(qū)動有數(shù)據(jù)共享,所以必須多例)

9.單例的書寫及各種模式的區(qū)別

面試官讓我手寫出一種單例模式并解釋各種模式的區(qū)別,此處最好寫出雙重校驗鎖模式。

〃雙重校齡鎖寫法

classSingleDemoProblem4{

privateSingleDemoProblem4(){}

privatestaticSingleDemoProblem4sdp=null;

privatestaticObjectobj=newObject();

publicstaticSingleDemoProblem4getlnstance(){

/*設(shè)置雙重校驗鎖防止多線程情況下,某個線程進(jìn)來判斷變量為空進(jìn)入準(zhǔn)備創(chuàng)建

對象,但還沒創(chuàng)建CDU被搶走.

別的線程過來發(fā)現(xiàn)變量還是空又進(jìn)來創(chuàng)建對象,結(jié)果導(dǎo)致多個線程創(chuàng)建多個對象出

來*/

if(sdp==null){

synchronized(obj){

if(sdp==null){

sdo=newSingleDemoProblem4();

)

}

)

returnsdp;

)

}

餓漢式:在類加載時就創(chuàng)建對象,不管對象用不用都會創(chuàng)建,造成內(nèi)存的浪費。但能保證對

象的唯一性。

10.懶漢式:只在使用的時候創(chuàng)建對象,多線程下不能保證每

次使用的對象唯一。

ll.SpringBuild和springBuffer的區(qū)另!J

聯(lián)系:兩者都是字符串緩沖區(qū)類,作用與功能相似,內(nèi)部的方法也都相同.但使用場景不同.

區(qū)別:

StringBuffer是線程安全的,但對于多線程效率低下(因為內(nèi)部用了synchronize關(guān)鍵字保證線

程安全,這樣必然犧牲了執(zhí)行效率)

StringBuilder安全性稍差,但對于多線程效率稍高

12.Mybatis中${}和#{}的區(qū)別

此處要點是注意哪種能防止sql注入,為什么能防止sql注入。

在Mybatis的mappe呻,參數(shù)傳遞有2種方式,一種是#0另一種是$0,兩者有著很大的區(qū)別:

應(yīng))實現(xiàn)的是sq暗句的預(yù)處理參數(shù),之后執(zhí)行sql中用?號代替,使用時不需要關(guān)注數(shù)據(jù)類型,

Mybatis自動實現(xiàn)數(shù)據(jù)類型的轉(zhuǎn)換。并且可以防止SQL注入。

$0實現(xiàn)是sql語句的直接拼接,不做數(shù)據(jù)類型轉(zhuǎn)換,需要自行判斷數(shù)據(jù)類型。不能防止SQL注入

是不是$0就沒用了呢?不是的,有些情況下就必須使用$0,舉個例子:

在分表存儲的情況下,我們從哪張表查詢是不確定的,也就是說sq語句不能寫死,表名是動態(tài)

的,查詢條件的固定的.這樣,SELECTxFROMSftableName}WHEREid=^{id}

#{}占位符,用于參數(shù)傳遞。

${}用于SQL拼接。

13.線程池問題

問你用的線程池引用的哪個包。

…。rs類提供了用于此包中所提供的執(zhí)行程序服務(wù)的工廠方法

和線程池有關(guān)的幾個概念:

最大容量:一個線程池中最多可以保存的線程數(shù)量;

最小容量:一個線程池中,最少保存的線程數(shù)量;

最大存活時間:一個線程最多可以保持空閑的時間;如果超出這個時間,一般這個線程就會

被銷毀;

線程的?些面試問題要多了解。

Linux怎么查看文件內(nèi)容的前10行,怎么查看進(jìn)程

1、Linux你肯定不能說不知道,說了解一點,然后他會問你一些常用指令,所以要記住一些

常用的指令。有的答不出來就說平時用的不多,而且平時不會就會上網(wǎng)查。

2、Netstat-an|grep80查看端口信息

3、Vim中:/內(nèi)容直接搜索內(nèi)容

4、Ps-ef|grepredis查看服務(wù)端口進(jìn)程

5、servicenetworkrestart重啟網(wǎng)絡(luò)服務(wù)

6、tail-200fcatalina.log動態(tài)顯示日志最后200行

7、head-n10catalina.log查看前1。行命令

tar-zcvfabc.tar.gz*壓縮當(dāng)前目錄下所有文件,壓縮后文件名為

abc.tar.gz

tar-zxvfabc.tar.gz-C/usr/local/xixi/解壓到指定目錄中記得指定目錄前

面加-C

8、查找文件

查找的是腳本文件(執(zhí)行文件)whichfilename

查找的是二進(jìn)制的文件(執(zhí)行文件)whereis-bfilename

查找特定文件whereisfilename(利用數(shù)據(jù)庫來查找)

12、eclipse快捷鍵

Alt+Shift+M任意選中一塊代碼,自動轉(zhuǎn)換為方法,自動添加參數(shù)返回類型。

ctrl+shift+x轉(zhuǎn)為大寫ctrl-shift+y轉(zhuǎn)為小寫

13、hashmap和hashtable的區(qū)另U

I--:HashMap:是開發(fā)中使用最多的一個map集合類;在它的底層使用哈希表保存數(shù)據(jù)(數(shù)

據(jù)是無序的);它的鍵和值允許使用null;是線程不安全的;

I—:LinkedHashMap:是HashMap的子類,主要操作和HashMap一樣;不同的是,在底層使

用哈希表和鏈表保存數(shù)據(jù),哈希表負(fù)責(zé)保存數(shù)據(jù)和維護(hù)數(shù)據(jù)的唯一性,鏈表負(fù)責(zé)記錄數(shù)據(jù)添

加的順序;所以它和HashMap不同之處是,它的數(shù)據(jù)是有序的(添加和迭代的順序一樣);

實際上,在HashSet底層就是使用的HashMap實現(xiàn)的;LinkedHashSet底層使用的是

LinkedHashMap實現(xiàn):

I--:HashTable:出現(xiàn)的比較早,在JDK1.1版本就出現(xiàn);它的主要操作和HashMap一格不

同之處在于,HashTable是線程安全的,效率比較低;它不允許使用null做鍵或值;在實際開

發(fā)中現(xiàn)在被HashMap取代;

I-:Properties:主要保存Key-Value的集合,在開發(fā)中主要用來操作配置文件(文件中的配

置信息都是鍵值對的形式)到I。流在學(xué);

I--:TreeMap:底層使用二又樹實現(xiàn),它保存的數(shù)據(jù),在保存的時候鍵都是有序的;

此處還問了一個課堂沒講過的實現(xiàn)類可取代hashTable,它是ConcurrentHashMap,這個自己

可做下了解。

14、ConcurrentHashMap與HashTable都可以用于多線程的

環(huán)境,但是當(dāng)Hashtable的大小增加到一定的時候,性能

會急劇下降,因為迭代時需要被鎖定很長的時間。因為

ConcurrentHashMap引入了分割(segmentation),不論它

變得多么大,僅僅需要鎖定m叩的某個部分,而其它的線

程不需要等到迭代完成才能訪問mapo簡而言之,在迭代

的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,

而Hashtable則會鎖定整個m叩。

15、HashTable雖然性能上不如ConcurrentHashMap,但并

不能完全被取代,兩者的迭代器的一致性不同的,

HashTable的迭代器是強(qiáng)一致性的,而

ConcurrentHashMap是弱一致的。ConcurrentHashMap

的get,dear,iterator都是弱一致性的。

16、ArrayList怎么去重

17、巧妙利用hashSet不能存儲重復(fù)元素的原理,把

arrayList放到hashSet中再放回arrayList即可。

18、說說垃圾處理機(jī)制

大致了解,能說出一點即可

現(xiàn)在使用的Java虛擬機(jī)并不是只是使用一種內(nèi)存回收機(jī)制,而是分代收集的算法。就是將內(nèi)

存根據(jù)對象存活的周期劃分為幾塊。一般是把堆分為新生代、和老年代。短命對象存放在新

生代中,長命對象放在老年代中。

對于不同的代,采用不同的收集算法:

19、新生代:由于存活的對象相對比較少,因此可以采用

復(fù)制算法該算法效率比較快。

20、老年代:由于存活的對象比較多哈,可以采用標(biāo)記?清

除算法或是標(biāo)記?整理算法

21、是否寫過mysql的存儲過程

mysql執(zhí)行語句是要先編譯,然后再執(zhí)行的。這樣如果查詢并發(fā)大的時候。會浪費很多資源

和時間。造成mysql進(jìn)程占用資源過多,癥狀就是慢。

但存儲過程可以把一些特別的語句封裝成一個方法,再編譯好成一個可以執(zhí)行的方法,對

外只要接收參數(shù)就可以了,這樣就不用再編譯。執(zhí)行就快了

22、什么時候會用到?你覺得你數(shù)據(jù)庫因為同時出現(xiàn)太多

讀寫操作而變得慢,那么就要用了。

23、JDBC底層步驟

1、注冊驅(qū)動..

Class.forName("com.mysql.jdbc.Driver");

2、獲得型據(jù)庫連接

Connectionconn=DriverManager.getConnection(url,user,password)

3、創(chuàng)建向數(shù)據(jù)庠發(fā)送sql的statement對象

Statementstmt=conn.CreateStatement();

4、向數(shù)據(jù)庫發(fā)送sq]

Resultsetrs=stmt.executeQuery(sql);//select語句

intupdateSum=stmt.executeUpdate(sql);//insertsupdate、delete語句

5、處理結(jié)果集

while(rs.nextO){

rs.getString(列名或者列的別名)

rs.getlnt(列卸

6、關(guān)閉資源

rs.closeO;

stmt.closeO;

conn.closet);

24、Jvm機(jī)制及類的加載過程

棧區(qū),堆區(qū),方法區(qū)

類加載順序:

類加載時先在方法區(qū)中為類開辟一個空間,非靜態(tài)成員加載到非靜態(tài)區(qū)域,靜態(tài)成員加載到

靜態(tài)區(qū)域,為靜態(tài)成員變量分配空間并賦默認(rèn)值,然后執(zhí)行靜態(tài)代碼塊或顯示賦值,賦值完

成類加載結(jié)束。

對象創(chuàng)建過程:

25、遇到new關(guān)鍵字在堆中開辟一個空間,為非靜態(tài)成員

變量分配空間并賦默認(rèn)值,執(zhí)行構(gòu)造函數(shù)先看有沒有this

語句調(diào)用其他構(gòu)造函數(shù),沒有就執(zhí)行隱式三步:1、執(zhí)行

父類構(gòu)造函數(shù),2、為非靜態(tài)成員變量顯示賦值,3、執(zhí)行構(gòu)

造代碼塊。結(jié)束后執(zhí)行構(gòu)造函數(shù)體中的內(nèi)容,執(zhí)行完對象

創(chuàng)建結(jié)束。

26、抽象類和接口的區(qū)別

共同點:都可以有抽象函數(shù),都不能被實例化。

區(qū)別:

聲明上:抽象類,class;接口interface

書寫成員:抽象類,書寫任何類成員;接口:只能書寫成員變量和函數(shù)

有無構(gòu)造函數(shù):抽象類,有構(gòu)造函數(shù);接口:沒有構(gòu)造函數(shù)。

作用上:抽象類是描述的繼承體系中的共同的特征和行為,如果行為不確定,就定義為抽象

函數(shù);接II描述的是不屬于繼承體系的共同的功能;接II可以用來定義規(guī)則。

繼承關(guān)系上:抽象類:單一繼承,多重繼承;接口:多

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論