具有技能

最近一直在面試,結合螞蟻課堂的材料,對之前所學的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工程師,三年走向人生巔峯,迎娶白富美(不切實際)。

相關文章
相關標籤/搜索