最近一直在面試,結合螞蟻課堂的材料,對之前所學的java作了下總結:前端
JAVA基礎部分java
JAVA多線程linux
集合框架android
JAVAWEB程序員
HTTP通訊web
J2EE框架面試
設計模式ajax
項目講解redis
項目中遇到的問題,如何解決,亮點spring
項目發佈環境
項目人員分配
最近學的新技術
之後的打算
HADOOP,HDFS,MAPREDUCE,LINUX
一.Java初中級程序員必備技能
1.熟悉java基礎、面向對象、jvm、io流、多線程、集合框架
2.熟悉jsp、servlet、Spring、Hibernate、SpringMvc
3.熟悉Http協議、Socket、webService及網絡編程
4.Maven及linux經常使用命令
5.項目相關知識
二.面試官會問到那些問題
1.java基礎方面:
使用final修飾對象
是指對象的內存地址不變,而其內容能夠被改變
靜態變量與實例變量區別
運行時區別,前者類加載完成時,其變量就已分配內存地址,然後者需在類實例化後,纔會被分配空間
「==」與equals的區別:
數據爲基本數據類型時沒區別,都是比較變量值內容相等,而當數據類型爲引用數據類型時,前者比較的是引用數據的內存地址,然後者仍比較的是值。
Int與integer的區別
一個是基本數據類型,一個是引用數據類型,前者默認值爲0.後者爲null。
重載與重寫的區別
前者是在一個類中,方法名相同,但參數個數or類型不一樣時稱爲方法的重載。後者是在有繼承關係的兩個類中,子類方法與父類方法相同的狀況。
接口與抽象類的區別
定義的關鍵字不一樣;接口中不能有普通方法,抽象類中能夠有普通方法。
String字符串常量;StringBuffer字符串變量,線程安全;Stringbuilder字符串變量,線程不安全;
數組沒有length()方法,但有length屬性;String有length()方法。
運行時異常與通常異常有何區別?前者是運行時出現的異常,後者是在編譯期出現的異常。
2.Java多線程方面:
1)什麼是多線程?
在一個應用程序中,同時,有多個不一樣的執行路徑。多線程的做用是提高程序效率。
2)線程和進程有什麼區別?:線程是進程的一條執行路徑,而進程是線程的集合。
3)什麼是線程同步、異步?
線程同步表示,當前線程執行完後下一個線程接着執行。
線程異步表示, 在一個應用程序中,同時,有多個不一樣的執行路徑。例如javaweb ajax android handler
4)線程之間如何同步:線程之間同步使用 synchronized、wait與 notify
5)什麼是線程不安全?如何解決?(重點):就是在多個線程共享同一個數據會受到其餘線程的干擾。如何解決:使用線程同步技術, 用上鎖(synchronized)。 讓一個線程執行完了,在讓另外一個線程執行。
6)如何建立一個線程?有幾種方法:繼承thread類, 重寫run方法、實現Runnalbe接口,從新run方法 , 啓動一個線程用start();
7)是使用Runnalbe接口好?仍是繼承Thread類好:是實現Runnalbe接口好,由於實現的接口還能夠繼續繼承。若是繼承了Thread類不能在繼承。
3.集合框架方面
List 和Set、Map 區別:都是接口,它們有各自的實現類。Set的實現類主要有HashSet和TreeSet,List的實現類主要有ArrayList、LinkedList,Map的實現類主要有HashMap和TreeMap。
Set中的對象不按特定方式排序,而且沒有重複對象。但它的有些實現類能對集合中的對象按特定方式排序,例如TreeSet類。
List中的對象按照索引位置排序,能夠有重複對象,容許按照對象在集合中的索引位置檢索對象,如經過list.get(i)方式來得到List集合中的元素。
Map中的每個元素包含一個鍵對象和值對象,它們成對出現。鍵對象不能重複,值對象能夠重複。
說出 ArrayList,Vector, LinkedList 的存儲性能和特性
ArrayList和Vector都是使用數組方式存儲數據,查詢數據快而插入數據慢,Vector因爲使用了synchronized方法(線程安全),一般性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,插入速度較快而查詢慢。
HashSet和TreeSet有什麼區別:
HashSet中的元素不能重複,沒有順序
TreeSet中的元素不能重複,但有順序
HashMap 和 Hashtable 的區別
前者容許有空的鍵和值,然後者不容許;後者線程安全,而前者不安全。
比較下集合和數組的優缺點
集合是多個對象的容器,能夠將不一樣數據類型的多個對象組織在一塊兒
數組類型是有相同數據類型的數據集合,數組是不少語言都支持的底層數據結構,性能上是最高的
在List裏面怎麼去掉重複的數:經過把List裏面的數據放入HashSet能夠去除重複
4.Http協議
get與post請求區別?(初級程序員必備問題)
區別一:
get重點在從服務器上獲取資源,post重點在向服務器發送數據;
區別二:
get傳輸數據是經過URL請求,以field(字段)= value的形式,置於URL後,並用"?"鏈接,多個請求數據間用"&"鏈接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,這個過程用戶是可見的;
post傳輸數據經過Http的post機制,將字段與對應值封存在請求實體中發送給服務器,這個過程對用戶是不可見的;
區別三:
Get傳輸的數據量小,由於受URL長度限制,但效率較高;
Post能夠傳輸大量數據,因此上傳文件時只能用Post方式;
區別四:
get是不安全的,由於URL是可見的,可能會泄露私密信息,如密碼等;
post較get安全性較高;
區別五:
get方式只能支持ASCII字符,向服務器傳的中文字符可能會亂碼。
post支持標準字符集,能夠正確傳遞中文字符。
https和http有什麼區別:前者在後者的基礎上進行了加密,傳輸更安全。
5.javaWeb方面
講下Servlet的執行流程。doGet和doPost的區別
Servlet的執行流程也就是servlet的生命週期,當服務器啓動的時候生命週期開始,而後經過init()方法初始化servlet,再根據不一樣請求調用doGet或doPost方法,最後再經過destroy()方法進行銷燬。
doGet和doPost都是接受用戶請求的方法,doGet處理get請求,doPost處理post請求,doGet用於地址欄提交,doPost用於表單提交,在頁面提交數據時,get的數據大小有限制4k,post沒有限制,get請求提交的數據會在地址欄顯示,post不顯示,因此post比get安全.
如何處理servlet的線程不安全問題
線程安全就是多線程操做同一個對象不會有問題,線程同步通常來保護線程安全,因此能夠在Servlet的線程裏面加上同步方法或同步塊。(Synchronized)能夠保證在同一時間只有一個線程訪問,(其實就是把一個全局變量改成局部變量)
Jsp的九大內置對象,三大指令,七大動做的具體功能
JSP九大內置對象:
pageContext :只對當前jsp頁面有效,裏面封裝了基本的request和session的對象
Request :對當前請求進行封裝
Session :瀏覽器會話對象,瀏覽器範圍內有效
Application :應用程序對象,對整個web工程都有效
Out :頁面打印對象,在jsp頁面打印字符串
Response :返回服務器端信息給用戶
Config :單個servlet的配置對象,至關於servletConfig對象
Page :當前頁面對象,也就是this
Exception :錯誤頁面的exception對象,若是指定的是錯誤頁面,這個就是異常對象
三大指令:
Page :指令是針對當前頁面的指令
Include :用於指定如何包含另外一個頁面
Taglib :用於定義和指定自定義標籤
七大動做:
Forward,執行頁面跳轉,將請求的處理轉發到另外一個頁面
Param :用於傳遞參數
Include :用於動態引入一個jsp頁面
Plugin :用於下載javaBean或applet到客戶端執行
useBean :使用javaBean
setProperty :修改javaBean實例的屬性值
getProperty :獲取javaBean實例的屬性值
4)獲取頁面的元素和值有幾種方式,分別說一下
request.getParameter() 返回客戶端的請求參數的值
6.Java框架部分
說說Spring?
Spring是對j2EE諸多功能進行封裝了的一個工具集;它的核心就是提供了一種新的機制來管理業務對象及依賴關係;具體就是控制反轉、依賴注入,Aop(面向切面)。
Spring的底層實現機制是什麼?
使用Demo4j(解析XML)+Java反射機制
Demo4j 其實就是解析XML。使用反射機制實例化bean。
說SpringIOC、SpringAOP?
SpringIOC ,其實就是依賴注入、控制反轉。至關於把每一個bean與bean之間的關係交給第三方容器管理。而這個容器就是spring
SpringAOP 面向切面的編程,或AOP,是一種編程技術,容許程序模塊化橫向切割關注點,或者橫切典型的責任劃分,主要應用如日誌和事務管理。 SpringAop的底層實現機制就是用JDK動態代理:對實現了接口的類生成代理
Spring有那些註解?
@Autowired(按類型注入)
@Service(標示爲注入爲服務層)
@Resource(按名稱注入)
@Controller(標識控制器bean id)
@RequestMapping(表示映射URL路徑)
Spring缺點:
使用到了大量反射機制。反射機制很是佔內存,
SpringMVC工程流程
1. 用戶向服務器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
2. DispatcherServlet對請求URL進行解析,獲得請求資源標識符(URI)。而後根據該URI,調用HandlerMapping得到該Handler配置的全部相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
3. DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter。(附註:若是成功得到HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
4. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程當中,根據你的配置,Spring將幫你作一些額外的工做:
HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換爲指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
5. Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;
6. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
7. ViewResolver 結合Model和View,來渲染視圖
8. 將渲染結果返回給客戶端。
SpringMVC工做流程描述
在web.xml文件中配置DispatcherServlet類;SpringMvc工做時主要是經過DispatcherServlet管理接收到的請求並進行處理。
什麼是Hibernate?
hibernate是一個基於ORM持久框架,可讓程序員以面向對象的思想操做數據庫,提升生產效率.
什麼是ORM?
orm不過是一種思想,對象關係映射。是對象關係模型,如hibernate,讓你以面向對象的方式去編程。封裝了JDBC.
說一下orm與jdbc的區別?
jdbc只是一個java操做數據庫的規範接口而已
orm不過是一種思想,對象關係映射。
ORM:是對象關係模型,如hibernate,讓你以面向對象的方式去編程。封裝了JDBC.
JDBC:是從底層訪問數據庫服務器。通常銀行,金融行業爲了安全起見,直接用JDBC訪問
Hibernate中get和load有什麼不一樣之處?
load :找不到數據的話會拋出org.hibernate.ObjectNotFoundException異常。此時hibernate會使用延遲加載加載機制
get找不到的話會返回null。
若是查詢不到數據,get 會返回 null,可是不會報錯, load 若是查詢不到數據,則報錯ObjectNotFoundException
使用get 去查詢數據,(先到一級/二級)會當即向db發出查詢請求(select ...), 若是你使用的是 load查詢數據,(先到一級、二級))即便查詢到對象,返回的是一個代理對象,若是後面沒有使用查詢結果,它不會真的向數據庫發select ,當程序員使用查詢結果的時候才真的發出select ,這個現象咱們稱爲懶加載(lazy)
什麼是Mybatis?
Mybatis的前生是ibatis,最後升級版本後名稱叫mybatis。mybatis是以純sql操做數據。
Mybatis與Hibernate區別?
Hibernate是面向對象的思想操做數據生成Sql語句,而mybatis是以純sql操做數據
相對於mybatis容易優化.擴展性好,可是移植性差。
MyBatis/Ibatis中#和$的區別
1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,若是傳入的值是111,那麼解析成sql時的值爲order by "111", 若是傳入的值是id,則解析成的sql爲order by "id".
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,若是傳入的值是111,那麼解析成sql時的值爲order by user_id, 若是傳入的值是id,則解析成的sql爲order by id.
3. #方式可以很大程度防止sql注入。
4.$方式沒法防止Sql注入。
5.$方式通常用於傳入數據庫對象,例如傳入表名.
6.通常能用#的就別用$.
STRUCTS
Struts是一個基於Sun J2EE平臺的MVC框架,主要是採用Servlet和JSP技術來實現的。因爲Struts能充分知足應用開發的需求,簡單易用,敏捷迅速,在過去的一年中頗受關注。Struts把Servlet、JSP、自定義標籤和信息資源(message resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再本身編碼實現全套MVC模式,極大的節省了時間,因此說Struts是一個很是不錯的應用框架。
Hibernate
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。 Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序實用,也能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。,Hibernate能夠在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任
7.設計模式部分
什麼是單例?單例有那些寫法?
單例分類:懶漢式單例、餓漢式單例
單例模式有如下特色:
一、單例類只能有一個實例。
二、單例類必須本身建立本身的惟一實例。
三、單例類必須給全部其餘對象提供這一實例。
①懶漢式單例
1. //懶漢式單例類.在第一次調用的時候實例化本身
2. public class Singleton {
3. private Singleton() {}
4. private static Singleton single=null;
5. //靜態工廠方法
6. public static Singleton getInstance () {
7. if (single == null) {
8. single = new Singleton();
9. }
10. return single;
11. }
12. }
②餓漢式單例
13. //餓漢式單例類.在類初始化時,已經自行實例化
14. public class Singleton1 {
15. private Singleton1() {}
16. private static final Singleton1 single = new Singleton1();
17. //靜態工廠方法
18. public static Singleton1 getInstance() {
19. return single;
20. }
21. }
懶漢式與餓漢式區別?
從名字上來講,餓漢和懶漢,
餓漢就是類一旦加載,就把單例初始化完成,保證getInstance的時候,單例是已經存在的了,
而懶漢比較懶,只有當調用getInstance的時候,纔回去初始化這個單例。
另外從如下兩點再區分如下這兩種方式:
一、線程安全:
餓漢式天生就是線程安全的,能夠直接用於多線程而不會出現問題,
懶漢式自己是非線程安全的,爲了實現線程安全有幾種寫法,分別是上面的一、二、3,這三種實如今資源加載和性能方面有些區別。
二、資源加載和性能:
餓漢式在類建立的同時就實例化一個靜態對象出來,無論以後會不會使用這個單例,都會佔據必定的內存,可是相應的,在第一次調用時速度也會更快,由於其資源已經初始化完成,
而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候纔會實例化對象出來,第一次調用時要作初始化,若是要作的工做比較多,性能上會有些延遲,以後就和餓漢式同樣了。
代理模式
工廠模式
8.項目相關
你說說你作的最好的項目?
要重點介紹到①項目是作什麼?②用到那些技術?③整個項目中最大的亮點是?核心部分④遇到bug是怎麼解決的?
例如: 我認爲我作的最好的項目是
.......
使用技術SpringMVC+Mybatis+Spring+Maven,用maven管理jar包,使用tomcat集羣減輕單臺服務器壓力、使用redis緩解高併發請求。
你項目遇到bug?怎麼查問題?
例如:首先遇到了bug,會查詢日誌,經過日誌定位到某個類的行數,判斷是否有代碼問題。
你遇到了什麼bug?你是怎麼解決?
例如我本身項目中,查詢量很是大。經過日誌發現了堆內存溢出,最後經過優化代碼,減輕new和加大堆內存。
大家項目人員是怎麼分配的?
項目分配爲:
產品經理(負責提需求)
UI設計師(負責設計樣式文件)
Web前端(只作Web頁面前端靜態文件)
Java工程師(寫業務邏輯)
測試人員(負責測試bug)
非技術項目經理(負責項目管理、人員分配)
項目架構師(負責架構項目)
大家項目是怎麼發佈的?
企業當中項目都是發佈在linux環境上
小公司:使用maven編譯好經過打war包,放入到tomcat的webapps文件
說說linux經常使用命令?
Cat 查看某個文件
CP 拷貝
Ls 查看全部列表
Mv 移動文件
Rm 刪除文件
Grep 搜索日誌
Mkdir 建立目錄
9.大數據方面知識
hadoop核心組件有3個:
第一個就 是,GFS(Google File System),一個分佈式文件系統,隱藏下層負載均衡,冗餘複製等細節,對上層程序提供一個統一的文件系統API接口;
第二個是 MapReduce,Google發現大多數分佈式運算能夠抽象爲MapReduce操做。Map是把輸入Input分解成中間的Key/Value 對,Reduce把Key/Value合成最終輸出Output。這兩個函數由程序員提供給系統,下層設施把Map和Reduce操做分佈在集羣上運行, 並把結果存儲在GFS上;
第三個,BigTable,一個大型的分佈式數據庫,這個數據庫不是關係式的數據庫,而是一個巨大的表格,用來存儲結構化的數據。
Hadoop組成:
Hadoop框架最核心的設計由兩部分組成,分別是分佈式文件系統和分佈式計算框架。
分佈式文件系統Hdfs爲海量的數據提供了存儲,主要用於大規模數據的分佈式存儲。
分佈式計算框架MapReduce爲海量的數據提供了計算,它構建在分佈式文件系統之上,對存儲在分佈式文件系統中的數據進行分佈式計算。
Mapreduce設計思想
對付大數據並行處理:分而治之:
一個大數據若能夠分爲具備一樣計算過程的數據塊,而且這些數據塊之間不存在數據依賴關係,則提升處理速度的最好辦法就是採用「分而治之」的策略進行並行化計算。
MapReduce採用了這種「分而治之」的設計思想,對相互間不具備或者有較少數據依賴關係的大數據,用必定的數據劃分方法對數據分片,而後將每一個數據分片交由一個節點去處理,最後彙總處理結果。
上升到抽象模型:Map與Reduce:
MapReduce借鑑了函數式程序設計語言Lisp的設計思想。
用Map和Reduce兩個函數提供了高層的並行編程抽象模型和接口,程序員只要實現這兩個基本接口便可快速完成並行化程序的設計。
MapReduce的設計目標是能夠對一組順序組織的數據元素/記錄進行處理。
現實生活中,大數據每每是由一組重複的數據元素/記錄組成,例如,一個Web訪問日誌文件數據會由大量的重複性的訪問日誌構成,對這種順序式數據元素/記錄的處理一般也是順序式掃描處理。
MapReduce提供瞭如下的主要功能:
數據劃分和計算任務調度:系統自動將一個做業(Job)待處理的大數據劃分爲不少個數據塊,每一個數據塊對應於一個計算任務(Task),並自動調度計算節點來處理相應的數據塊。做業和任務調度功能主要負責分配和調度計算節點(Map節點或Reduce節點),同時負責監控這些節點的執行狀態,並負責Map節點執行的同步控制。
數據/代碼互定位:爲了減小數據通訊,一個基本原則是本地化數據處理,即一個計算節點儘量處理其本地磁盤上所分佈存儲的數據,這實現了代碼向數據的遷移;當沒法進行這種本地化數據處理時,再尋找其餘可用節點並將數據從網絡上傳送給該節點(數據向代碼遷移),但將盡量從數據所在的本地機架上尋 找可用節點以減小通訊延遲。
MapReduce提供瞭如下的主要功能2:
系統優化:爲了減小數據通訊開銷,中間結果數據進入Reduce節點前會進行必定的合併處理;一個Reduce節點所處理的數據可能會來自多個Map節點,爲了不Reduce計算階段發生數據相關性,Map節點輸出的中間結果需使用必定的策略進行適當的劃分處理,保證相關性數據發送到同一個Reduce節點;此外,系統還進行一些計算性能優化處理,如對最慢的計算任務採用多備份執行、選最快完成者做爲結果。
出錯檢測和恢復:以低端商用服務器構成的大規模MapReduce計算集羣中,節點硬件(主機、磁盤、內存等)出錯和軟件出錯是常態,所以 MapReduce須要能檢測並隔離出錯節點,並調度分配新的節點接管出錯節點的計算任務。同時,系統還將維護數據存儲的可靠性,用多備份冗餘存儲機制提 高數據存儲的可靠性,並能及時檢測和恢復出錯的數據
9.之前公司的信息
公司的web服務器什麼配置
(1)web服務器由六臺服務器組成的weblogic集羣,單機配置大約2*8核cpu、64g內存、1T服務器硬盤(可根據狀況增長至12臺或更多)
(2)數據庫單獨部署在一個高性能服務器上,和web服務器在一個機房
Mysql版本:5.7.6
Spring版本:4.3.3
基於cs/BS哪一個架構:Bs架構
你最近有看什麼技術類的書嗎:think in java、head first java、java核心技術
職業規劃:兩年高級java工程師,三年走向人生巔峯,迎娶白富美(不切實際)。