在3月1號(hào)投完簡歷,做好測評(píng)以后,我是一直等啊等,始終期待著一面的到來。 好不容易在3月8號(hào)這天中午12點(diǎn)10左右接到了來自阿里的面試電話。 剛開始,我是一臉的懵逼啊,面試官問我:“你是不是面過了???”我是一臉黑臉問號(hào).jpg。Excuse me?在我一番解釋后,終于進(jìn)入了正題。 首先還是自我介紹。然后下面是問題清單: 1、平時(shí)在項(xiàng)目中主要負(fù)責(zé)哪塊技術(shù)啊?(我回答數(shù)據(jù)庫方面的代碼)好,那么請問,你所知道的數(shù)據(jù)庫方面所需要注意的地方有什么?怎么優(yōu)化數(shù)據(jù)庫? 引申出來以后,他又我問了我關(guān)于left join與right join的區(qū)別,(我回答了出來),然后,他又問我那inner join呢?(我當(dāng)時(shí)是忘記了,一臉懵逼啊,絕望放棄回答)?用很多join好嗎,有什么 缺點(diǎn)?(效率降低)
2、HTTP的特點(diǎn),TCP/UDP特點(diǎn)以及區(qū)別? 1.支持客戶/服務(wù)器模式。 2.簡單快速:客戶向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。 3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。 4.無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。 5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。 3、HashMap、HashTable、ConCurrentHasgMap的區(qū)別以及實(shí)現(xiàn)原理? 對(duì)于put和remove操作,是使用鎖同步來進(jìn)行的,不過是用的ReentrantLock而不是synchronized,性能上要更高一些。它們的實(shí)現(xiàn)前文都已經(jīng)提到過,就沒什么可分析的了。 我們還需要知道一點(diǎn),ConcurrentHashMap的迭代器不是Fast-Fail的方式,所以在迭代的過程中別其他線程添加/刪除了元素,不會(huì)拋出異常,也不能體現(xiàn)出元素的改動(dòng)。但也沒有關(guān)系,因?yàn)槊總€(gè)entry的成員除了value都是final修飾的,暴漏出去也不會(huì)對(duì)其他元素造成影響。
友情鏈接:深入理解HashMap(及hash函數(shù)的真正巧妙之處) 4、怎么實(shí)現(xiàn)并發(fā)編程?請?jiān)敿?xì)描述? 鎖機(jī)制(Lock)、CAS無鎖算法、Synchronized區(qū)別 5、類加載機(jī)制(如果自己寫幾個(gè)Jar包,應(yīng)該放哪里?) 6、String、StringBuffer、StringBuilder的區(qū)別? 如果StringBuilder后增加一個(gè)字符串常量,并且這時(shí)候是多線程運(yùn)行,那這時(shí)候StringBuilder是線程安全的嗎? 字符串常量就是不能改變該對(duì)象,而后者是可是改變的字符串對(duì)象,他不像String一樣,需要每次創(chuàng)建,后兩者是在原有的字符串對(duì)象進(jìn)行操作的。 7、JDK7、8的區(qū)別? 在JMM方面的區(qū)別: 永久代 虛擬機(jī)團(tuán)隊(duì)在JDK8的HotSpot中,把永久代從Java堆中移除了,并把類的元數(shù)據(jù)直接保存在本地內(nèi)存區(qū)域(堆外內(nèi)存),稱之為元空間。 這樣做有什么好處? 而在JDK8中,類的元數(shù)據(jù)保存在本地內(nèi)存中,元空間的最大可分配空間就是系統(tǒng)可用內(nèi)存空間,可以避免永久代的內(nèi)存溢出問題,不過需要監(jiān)控內(nèi)存的消耗情況,一旦發(fā)生內(nèi)存泄漏,會(huì)占用大量的本地內(nèi)存。 ps:JDK7之前的HotSpot,字符串常量池的字符串被存儲(chǔ)在永久代中,因此可能導(dǎo)致一系列的性能問題和內(nèi)存溢出錯(cuò)誤。在JDK8中,字符串常量池中只保存字符串的引用。 8、JMM在初始化堆內(nèi)存時(shí),新生代與老年代的默認(rèn)比例是多少? 永久代不屬于堆內(nèi)存,堆內(nèi)存只包含新生代和老年代。 默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) –XX:NewRatio 來指定 ),即:新生代 ( Young ) = 1/3 的堆空間大小。
9、Spring中控制反轉(zhuǎn)定義?相比于創(chuàng)建對(duì)象的好處?AOP編程的優(yōu)點(diǎn)? 原來我們的程序我們控制的是具體的實(shí)現(xiàn),寫程序直接寫實(shí)現(xiàn),現(xiàn)在我們控制的是它的接口它的抽象,原來我們依賴的是它的實(shí)現(xiàn),現(xiàn)在我們依賴的是它的抽象。從具體的實(shí)現(xiàn)反轉(zhuǎn)到抽象的概念上,我們針對(duì)的是接口編程。 1)降低組件之間的耦合度,實(shí)現(xiàn)軟件各層之間的解耦。 10、SpringMVC中動(dòng)態(tài)代理的實(shí)現(xiàn)機(jī)制,源碼? 友情鏈接:Spring AOP動(dòng)態(tài)代理原理與實(shí)現(xiàn)方式 (轉(zhuǎn)) 友情鏈接:Java的動(dòng)態(tài)代理機(jī)制和Spring的實(shí)現(xiàn)方式 友情鏈接:Java中動(dòng)態(tài)代理實(shí)現(xiàn)機(jī)制 11、讀過哪些源碼,請?jiān)敿?xì)描述一個(gè)你最熟悉的?(我回答ArrayList) 12、JVM虛擬機(jī)?請?jiān)敿?xì)描述? 13、Java GC回收機(jī)制?請?jiān)敿?xì)描述? 14、問了兩道智力題?。。。?! (1)有8個(gè)產(chǎn)品,其中有一個(gè)次品(有可能偏重,有可能偏輕),那么如何用天平秤三次找出那個(gè)次品? (2)忘記了。。。。關(guān)于買賣問題 15、看過GitHub上的開放源碼嗎(比如阿里,騰訊優(yōu)秀團(tuán)隊(duì)的)? 16、使用過哪些代碼管理工具?(Git,Maven)熟練使用嗎?會(huì)不會(huì)使用GitHub上傳代碼? 17、使用過哪些寫代碼的工具?(Myeclipse和IDE),列出你常用的快捷鍵? 18、學(xué)習(xí)編程的方法、渠道?(看博客,網(wǎng)站)?上哪些網(wǎng)站? 19、說說自己的優(yōu)缺點(diǎn)?學(xué)習(xí)時(shí)間的分配? 20、漏了一個(gè)問題,怎么實(shí)現(xiàn)讓兩個(gè)線程交替執(zhí)行?(用代碼實(shí)現(xiàn)?) 一般來說線程鎖可以用:Synchronized、Lock。 public class Thread1 {
public static void main(String args[]) {
final Bussiness business = new Bussiness();
Thread a=new Thread(new Runnable(){
@Override
public void run(){
business.SubThread();
}
});
Thread b=new Thread((new Runnable() {
@Override
public void run() {
business.MainThread();
}
}));
a.start();
b.start();
}
}
class Bussiness {
private static Object LOCK = new Object();
volatile boolean bShouldSub = true;//這里相當(dāng)于定義了控制該誰執(zhí)行的一個(gè)信號(hào)燈
public void MainThread() {
for (int i = 0; i < 50; i ) {
synchronized (LOCK) {//notify和wait的對(duì)象一定要和synchronized的對(duì)象保持一致
for (int j = 0; j < 10; j ) {
System.out.println(Thread.currentThread().getName() ' MainThread:i=' i ',j=' j);
}
if (bShouldSub) {
bShouldSub = false;
LOCK.notify();
if(i<49){
try {
LOCK.wait();
}catch (InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
}
}
public void SubThread() {
for (int i = 0; i < 50; i ) {
synchronized (LOCK){
for (int j = 0; j < 5; j ) {
System.out.println(Thread.currentThread().getName() ' SubThread:i=' i ',j=' j);
}
if (!bShouldSub) {
bShouldSub = true;
LOCK.notify();
if(i<49){
try {
LOCK.wait();
} catch (InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
}
}
}
各種容器的初始化長度是多少? 使用ArrayList初始化時(shí)注意事項(xiàng)?(自動(dòng)擴(kuò)充機(jī)制方面,原理實(shí)現(xiàn))? 好了,一面到此結(jié)束,歷時(shí)一個(gè)半小時(shí),淚崩,懵逼?。P(guān)鍵下午還有課!?。∵t到了?。。。?/p> 總結(jié)一點(diǎn),閱讀源碼很重要?。⊿pring SpringMVC Mybatis)
|
|