日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

2017年阿里內(nèi)推一面面經(jīng)(不斷更新)

 SheldonDemo 2017-04-05

在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)?(效率降低)

這里寫圖片描述

  • 關(guān)于索引:

    • 應(yīng)該建索引的字段:
      1.經(jīng)常作為查詢條件的字段
      2.外鍵
      3.經(jīng)常需要排序的字段
      4.分組排序的字段

    • 應(yīng)該少建或者不建索引的字段有:
      1.表記錄太少
      2.經(jīng)常需要插入,刪除,修改的表,
      3.表中數(shù)據(jù)重復(fù)且分布平均的字段


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)原理?
ConCurrentHasgMap調(diào)用get()方法的時(shí)候有鎖嗎?

對(duì)于put和remove操作,是使用鎖同步來進(jìn)行的,不過是用的ReentrantLock而不是synchronized,性能上要更高一些。它們的實(shí)現(xiàn)前文都已經(jīng)提到過,就沒什么可分析的了。

友情鏈接:ConCurrentHasgMap源碼分析

我們還需要知道一點(diǎn),ConcurrentHashMap的迭代器不是Fast-Fail的方式,所以在迭代的過程中別其他線程添加/刪除了元素,不會(huì)拋出異常,也不能體現(xiàn)出元素的改動(dòng)。但也沒有關(guān)系,因?yàn)槊總€(gè)entry的成員除了value都是final修飾的,暴漏出去也不會(huì)對(duì)其他元素造成影響。

  • 為什么hashmap擴(kuò)容是是擴(kuò)大成原來的2倍,而不是3倍?

友情鏈接:深入理解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ū)別:

永久代
在JDK8之前的HotSpot實(shí)現(xiàn)中,類的元數(shù)據(jù)如方法數(shù)據(jù)、方法信息(字節(jié)碼,棧和變量大小)、運(yùn)行時(shí)常量池、已確定的符號(hào)引用和虛方法表等被保存在永久代中,32位默認(rèn)永久代的大小為64M,64位默認(rèn)為85M,可以通過參數(shù)-XX:MaxPermSize進(jìn)行設(shè)置,一旦類的元數(shù)據(jù)超過了永久代大小,就會(huì)拋出OOM異常。

虛擬機(jī)團(tuán)隊(duì)在JDK8的HotSpot中,把永久代從Java堆中移除了,并把類的元數(shù)據(jù)直接保存在本地內(nèi)存區(qū)域(堆外內(nèi)存),稱之為元空間。

這樣做有什么好處?
有經(jīng)驗(yàn)的同學(xué)會(huì)發(fā)現(xiàn),對(duì)永久代的調(diào)優(yōu)過程非常困難,永久代的大小很難確定,其中涉及到太多因素,如類的總數(shù)、常量池大小和方法數(shù)量等,而且永久代的數(shù)據(jù)可能會(huì)隨著每一次Full GC而發(fā)生移動(dòng)。

而在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 的堆空間大小。
老年代 ( Old ) = 2/3 的堆空間大小。其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個(gè) Survivor 區(qū)域,這兩個(gè) Survivor 區(qū)域分別被命名為 from 和 to,以示區(qū)分。
默認(rèn)的,Edem : from : to = 8 : 1 : 1 ( 可以通過參數(shù) –XX:SurvivorRatio 來設(shè)定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。
JVM 每次只會(huì)使用 Eden 和其中的一塊 Survivor 區(qū)域來為對(duì)象服務(wù),所以無論什么時(shí)候,總是有一塊 Survivor 區(qū)域是空閑著的。
因此,新生代實(shí)際可用的內(nèi)存空間為 9/10 ( 即90% )的新生代空間。

  • Java內(nèi)存模型的描述?

9、Spring中控制反轉(zhuǎn)定義?相比于創(chuàng)建對(duì)象的好處?AOP編程的優(yōu)點(diǎn)?

友情鏈接:三大框架的原理及優(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)軟件各層之間的解耦。
Controller——>Service——>DAO
2)可以使用容器提供的眾多服務(wù),如:事務(wù)管理服務(wù)、消息服務(wù)等等。當(dāng)我們使用容器管理事務(wù)時(shí),開發(fā)人員就不再需要手工控制事務(wù).也不需處理復(fù)雜的事務(wù)傳播。
3)容器提供單例模式支持,開發(fā)人員不再需要自己編寫實(shí)現(xiàn)代碼。
4)容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截、運(yùn)行期監(jiān)控等功能。
5)容器提供的眾多輔作類,使用這些類能夠加快應(yīng)用的開發(fā),如: JdbcTemplate、 HibernateTemplate。
6)Spring對(duì)于主流的應(yīng)用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,這樣更便于應(yīng)用的開發(fā)。
7) 使用spring容器可以提供的服務(wù):事務(wù)管理服務(wù),JMS服務(wù),Spring Core核心服務(wù),持久化服務(wù)等。
8)如果使用Spring, 我們就不再需要手工控制事務(wù),例如在Hibernate中控制事務(wù)的語句 session.beginTransaction();session.getTransaction().commit();
9)使用Spring,不再需要我們處理復(fù)雜的事務(wù)傳播行為。


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。
這個(gè)題目的難點(diǎn)不在于同步塊,而在于怎么樣設(shè)計(jì)這個(gè)兩個(gè)線程的交替實(shí)現(xiàn)。由于線程爭用cpu的隨機(jī)性,就需要A線,B線程執(zhí)行,在B執(zhí)行完一次進(jìn)入等待之前喚醒A,如此往復(fù),那么這里就要用上notify和wait了。

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(); } } } } } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

各種容器的初始化長度是多少?

使用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)


上面題目的部分答案,歡迎前往歷年阿里面試題匯總(2017年不斷更新中)各大公司Java后端開發(fā)面試題總結(jié)查閱

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多