java面試總結1

1.自我介紹:
我是 *** 工做了**年
前後在**公司和**公司工做
前後作過**和**項目

2.簡單介紹一下**項目
爲了解決**問題,開發了**系統,該系統主要由**部分組成
我參與了**模塊的開發--簡單說一下該模塊的業務及設計
簡單介紹一下項目的總體架構,根據所在模塊進行解釋 java

3.java的專業技能 mysql

4.你還有什麼須要問個人?
暫時沒有。/ 公司項目是什麼以及項目用到的技術。git

5.多輪面試後,自我介紹和項目經驗面試官不關心。說一下你最擅長什麼?
簡單說一下。。本身最擅長的web

6.最終技術面試完後,回家等消息/等hr談薪資和福利 面試


1. java的跨平臺原理:
java經過不一樣的系統,不一樣版本、不一樣位數的jVM,來屏蔽不一樣的系統指令集差別,而對外提供統一的接口(java api)
普通java開發人員只須要按照接口開發便可
若是系統須要部署到不一樣的環境時,只須要在系統上安裝對應版本的虛擬機便可 sql

2.搭建java開發環境的步驟:
開發環境須要什麼:
適用於開發環境的jdk
對應開發環境的idea
須要web服務器(Tomcat)

1.下載對應的組件
2.安裝 按照正常流程便可
配置java_home (idea和Tomcat會依賴於這個變量 )
安裝idea,設置workspace的默認編碼
安裝Tomcat
將Tomcat集成到idea中
...
SVN git mongodb

3.java中的int數據佔幾個字節:4字節
java中有幾種數據類型: byte short int(4-32) long
float double char boolean(1字節) 數據庫

4. 封裝、繼承、抽象、多態--抽象問題舉例說明

封裝:張三姓名等屬性,要相對封閉。
name(set get)讓其餘類進行訪問設計模式

抽象:將顯示生活中的對象抽象成類
eg 張三api

繼承:父類和子類
設計和定義一個類,可使用已經存在的內容,也能夠新定義新的內容

多態: 同一個行爲具備多個不一樣表現形式或形態的能力。


5.有了基本類型爲何還要包裝類型:
包裝類型:每一個基本數據類型都會對應包裝類型

裝箱:
拆箱:

6. 字符串:String StringBuffer StringBuilder
String內容不可變,final的字符數組。
StringBuffer StringBuilder內容可變、字符串追加:

字符串拼接:String c = a + b ;
StringBuilder s = new StringBuilder();
s.append["a"].s.append["b"];
拼接字符串要使用stringBuilder和stringbuffer

StringBuffer和StringBuilder:StringBuilder線程不安全而效率較高 StringBuffer線程安全(加了同步鎖)、效率較低

7. 集合:值、key-value兩種
值【list、set】
key-value【map】

list:有序的、可重複的
set:無序、不可重複---根據equals和hashcode判斷。若是對象要存儲在set中,須要重寫equals和hashcode方法。

list: Arraylist、LinkedList
ArrayList 底層數組 連續的內存空間 ---適用於查詢多、插入刪除少時
LinkedList 鏈表 查詢時從頭結點開始,效率低,插入時不須要移動內存。 ---適用於查詢少、插入刪除多時

8. hashmap 和 hashtable :
(1)均可以存儲 key-valule
(2) hashmap能夠把null做爲key-value hashtable不能夠
(3)hashmap 線程不安全、效率高 hashtable線程安全、效率低

CurrentHashmap: 大的hashmap分爲小的hashtable,小的map實現了線程安全

9. 實現拷貝文件工具使用字節流仍是字符流?
拷貝文件(圖片、圖像)不知包含字符流還有字節流。須要字節流

10. 線程的幾種實現方式:
(1)繼承Thread類實現
(2)實現runnerable接口實現
繼承的擴展性不強(單繼承)。一個類繼承了Thread就不能繼承其餘類

啓動:
Thread thread = new Thread(new MyThread());
thread.start();

如何區分線程:設置線程名稱
thread.setName();

建立線程完成後,都須要設置名稱

11. 線程併發庫:JDK1.5
經過executor的四個靜態方法來建立線程池


12.線程池做用:
限定線程的個數,不過致使線程過多而致使線程溢出,致使系統運行緩慢或者崩潰。
不須要每次都去建立、銷燬,節省資源
不須要每次都去建立,響應時間更快。

13. 設計模式?
通過前人無數次的實踐,總結出的。能夠反覆使用、解決特定問題的設計方法。
經常使用的設計模式:單例模式、工廠模式、代理模式、包裝模式、

工廠模式:Spring IOC
對象的建立交給了一個工廠。

代理模式: Spring AOP

單例模式(確保一個類中只有一個實例):飽漢模式、飢漢模式

1.構造方法私有化,除了本身的類能建立外,其餘類不能夠建立。(飽漢一出來就建立,飢漢須要時才建立)
2.類內部提供建立一個單實例。
3.提供一個方法獲取該實例對象。(建立時須要方法同步)

飽漢--線程不安全
public class PersonalFactory{
private PersonalFactory(){

}
private static PersonalFactory instance = null;

public synchronized static PersonalFactory getInstance(){
if(instance = null){
instance = new PersonalFactory();
}
return instance;
}

public static void main(String arg[]){
PersonalFactory.getInstance.toString();
}
}


飢漢--線程安全
public class PersonalFactory{
private PersonalFactory(){

}
private static final PersonalFactory instance = new PersonalFactory();//類加載是即被建立
public static PersonalFactory getInstance(){
return instance;
}
}

雙重鎖模式,是飽漢模式的優化,進行雙重判斷,當已經建立過實例對象後就無需加鎖,提升效率。也是一種推薦使用的方式。
public class PersonalFactory{
private PersonalFactory(){

}
private static PersonalFactory instance = null;

public static PersonalFactory getInstance(){
if(instance = null){
synchronized(PersonalFactory.class){
if(instance == null){
instance = new PersonalFactory();
}
}
return instance;
}

public static void main(String arg[]){
PersonalFactory.getInstance.toString();
}
}




14.web:
get:獲取和查詢信息
post: 更新信息

相同點:都是http請求,經過不一樣的請求方式完成對url的不一樣操做,get、post、put、delete對應着資源的查、改、增、刪。get通常用於獲取和查詢信息,post通常用於更新信息。

區別:
地址欄--get請求數據會在地址欄顯示出來,post不會顯示在地址欄 。get經過url傳遞,post放在requestbody中
數據長度--get傳輸數據有限,post沒有。
安全性--post的安全性高於get。因此不能用來傳輸敏感信息。因爲數據會在地址欄中呈現,因此能夠經過歷史記錄找到密碼等關鍵信息,不安全。


15. servlet: java編寫的服務器端程序,這些servlet都要實現servlet接口。

主要功能:交互式的瀏覽和修改數據,生成動態web內容。動態網頁語言。
servlet繼承httpservlet重寫doget dopost

客戶端--服務器--服務器找到servlet,經過service方法/doget/dopost方法相應請求。

16. servlet的生命週期:
加載--實例化--初始化--處理請求--服務結束。

Servlet運行在Servlet容器中,其生命週期由容器來管理。
Servlet容器負責加載和實例化Servlet。
在Servlet實例化以後,容器將調用Servlet的init()方法初始化這個對象。初始化的目的是爲了讓Servlet對象在處理客戶端請求前完成一些初始化的工做,
Servlet容器調用Servlet的service()方法對請求進行處理
容器就會調用實例的destroy()方法,以便讓該實例能夠釋放它所使用的資源,保存數據到持久層


17. servlet的2種跳轉方式:

轉發 forward():
1【指服務器內部的重定向】 容器中控制權的轉向
2 在客戶端的地址欄中不會顯示轉向後的地址,仍是原來的地址
3 1次請求完成
4 服務器端完成,效率較高

重定向 redirect():
1 【客戶端的重定向】 是徹底的跳轉,即客戶端瀏覽器會獲取到跳轉後的地址,而後從新發送請求
2 所以瀏覽器中顯示跳轉後的地址。
3 這種方式比forward方式多了一次網絡請求
4 所以效率要低於forward方式。

forward()更加高效。可是若是須要跳轉到其餘服務器上的資源時,則須要使用sendRedirect()方法


18. jsp和servlet的區別:
相同點:jsp最終被翻譯爲servlet,再對外提供服務。
不一樣點: JSP(控制視圖):java+HTML ————> jsp頁面
servlet(控制邏輯)使用HtML的功能:必須使用getWriter的方式輸出HTML頁面

19. jsp的九大內置對象:
1. request對象:客戶端請求被封裝在request對象中 HttpServletRequest的實例
2.response對象: 包含了響應客戶端請求的信息 是HTTPServletResponse的實例
3. session對象:客戶端和服務器的一次會話
5 out 傳送回應的輸出
6 exception 錯誤網頁
7 page jsp頁面自己
8 application servlet正在執行的內容
9 config servlet的構架部件


jsp四大做用域:pagecontext application request session

jsp傳值:

20 session和cookie的區別 :
都是會話跟蹤技術。
cookie在客戶端記錄信息肯定用戶身份,session在服務器端記錄信息肯定用戶身份
session的實現依賴於cookie session的惟一標識sessionId需存放在客戶端

區別:
1.cookie在客戶端記錄信息肯定用戶身份,session在服務器端記錄信息肯定用戶身份
2.cookie不安全 分析本地的cookie進行cookie欺騙
3.session佔內存 必定時間保留在服務器上,當服務較多時會比較損耗服務器的性能
4.單個cookie保存的數據不會超過4K 不少瀏覽器限制一個站點最多保留20個cookie

我的建議:登陸信息等重要信息保存再session中,其餘信息,例如購物車,能夠存放在cookie中
可是coolie是能夠在客戶端禁用的,這時要使用cookie+數據庫的實現方式,當從cookie中不能取出數據時,要從數據庫中獲取。

21 MVC
Model JavaBean
View HTML jsp
Controller sevlet action
jsp+servlet+javabean

22.數據庫的分類:
關係型:mysql oracle SQLserver
非關係型:Redis memcache mongodb hadoop

23 關係型數據庫的三範式:
範式就是設計表時的規範:要知足第二範式,須要知足第一範式 要知足第三範式,須要知足第二範式
第一範式:1NF原子性 列數據的不可分割性 數據庫表的每一列都是不可分割的原子數據項 ,一個字段只存儲一項信息
第而範式:2NF 主鍵 表中的每行必須惟一可區分 當存在多個主鍵的時候,纔會發生不符合第二範式的狀況
第三範式:3NF 外鍵 要求一個數據庫表中不包含已在其它表中已包含的非主鍵字段

24.事務:
事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和持久性(durability)的縮寫。
原子性 操做事務內的操做不可分割,要麼都成功,要麼都失敗
一致性 事務執行失敗時,要對先前的操做回滾,保證一致性
隔離性 一個事務開始後 不受其餘的事務的干擾
持久性 事務開始了就不能終止了

25. 最大鏈接數:
特定服務器的數據庫只能支持同時鏈接必定的數目,所以須要設置一個最大鏈接數。

26. mysql的分頁:
limit offset,size 從多少索引多少位

oracle的分頁:
使用三層嵌套查詢:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21


27. 觸發器:校內網、Facebook ,發帖時通知好友。
須要有出發條件,觸發後完成什麼操做。
增長日誌時,觸發器起做用,通知表中寫入

28. 存儲過程:存儲過程其實就是能完成必定操做的一組SQL語句。複雜邏輯和安全性要求高的時候使用存儲過程。
1.只在建立時編譯一次,之後每次執行都不須要再次編譯。提升數據庫的執行速度
2.複雜業務邏輯須要多條SQL語句,客戶機和服務器之間的網絡傳輸會大大減小,下降網絡負載。
3.減小工做量 存儲過程能夠重複使用,減小了數據庫開發人員的工做量。
4.安全性高 能夠設定只有某些用戶纔有對存儲過程的使用權。

29. 定義存儲過程:

30 jdbc的存儲過程:
加載驅動
獲取鏈接
設置參數
執行
釋放鏈接

31.對JDBC的理解:
java只定義接口 數據路廠商本身實現接口,咱們只須要導入對應的廠商實現的接口,而後調用。

32.寫一個訪問oracle數據庫的jdbc:
賈璉欲執事
加載驅動 Class.forName("com.mysql.jdbc.Driver");
獲取鏈接 Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
設置參數 statement preparestatement csmt.setXX(index,value)
執行 exxcute executeUpdate
釋放鏈接 釋放鏈接要從小到大
public class javaTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&amp;characterEncoding=utf-8";
String USER="root";
String PASSWORD="tiger";
//1.加載驅動程序
Class.forName("com.mysql.jdbc.Driver");
//2.得到數據庫連接
Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
//3.經過數據庫的鏈接操做數據庫,實現增刪改查(使用Statement類)
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select * from user");
//4.處理數據庫的返回結果(使用ResultSet類)
while(rs.next()){
System.out.println(rs.getString("user_name")+" "
+rs.getString("user_password"));
}

//關閉資源
rs.close();
st.close();
conn.close();
}
}

33. PrepareStatement(設置參數)和statement(語句拼接)的比較: 1.PrepareStatement預編譯比statement速度快 2.代碼的可讀性和可維護性好 3.安全性 PrepareStatement能夠防止SQL注入攻擊 使用預編譯語句傳入的任何內容不會和原來的語句發生任何的匹配關係 使用預編譯語句不用對傳入的任何內容作任何過濾 34.

相關文章
相關標籤/搜索