1. 程式人生 > >常見Java開發面試題(應屆生)(更新中)

常見Java開發面試題(應屆生)(更新中)

Java基礎篇

Java8大基本資料型別

byte short int long float double char boolean
佔用空間 1位元組(B) 2位元組 4位元組 8位元組 4位元組 8位元組 不定 預設2位元組 JVM未定義
初始值 0 0 0 0 0.0 0.0 空格 false

Java的三大特性

1. 封裝:隱藏內部功能的具體實現,只保留和外部交流資料的介面。例:汽車與發動機,不必知道發動機的實現原理,只需使用汽車給予的介面,插入鑰匙。
2. 繼承:一個物件可以從它的父類繼承所有的通用的屬性和方法,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件;最大的好處是實現程式碼的高效重用。
3. 多型:同一個動作作用於不同的物件 所產生不同的行為。例:人會吃飯,中國人用筷子,美國人用叉子。

面向物件

1. 面向物件的核心,就是類和物件。Java中的面向物件的思想:萬物皆物件。
2. 類:是對一類事物的描述,是抽象的,看不見,摸不著
3. 物件:是實際存在的該類事物的每個個體 也稱為例項 是具象的
4. 所以面向物件程式設計的重點是類的設計,而不是物件的設計。 
5. 類是物件的描述
   物件叫做類的例項化(Instance)
6. 類不佔記憶體,物件才佔記憶體。

如果讓你推銷一款Java產品,你會怎麼推銷呢?

1.Java是面向物件的
2.Java是跨平臺的;一次編譯,到處執行
3.Java是多執行緒的
4.Java有GC,簡化了開發
5.Java是分散式的
6.Java現在運用最廣泛

StringBuilder和StringBuffer的區別

1. 他們都是可變長度的字串
2. StringBuffer  執行緒安全   效率低
3. StringBuilder  執行緒不安全  效率高

簡單介紹下多型

多型:同一種事物的多種形態。
作用:1.不必為每一個派生類編寫功能呼叫,只需要對抽象基類進行處理即可,提高可複用性;
	  2.派生類的功能可以被基類的方法或引用變數所呼叫,提高可擴充套件性。
1. 編譯時多型	方法過載overload
	- 方法名必須相同
	- 形參列表必須不同(形參的資料型別和形參的個數不同)
	- 與返回值型別無關
2. 執行時多型	方法重寫overwrite
	- 必須存在繼承關係
	- 重寫的方法、返回值型別、引數列表必須和父類的方法保持一致
	- 子類的訪問修飾符不能低於父類方法的訪問修飾符 public

String能被繼承嗎?

public final class String implements java.io.Serializable, Comparable<String>, CharSequence 
不能,他是被final修飾的。
底層是由陣列實現,陣列長度不可變

簡單介紹一下static關鍵字

static標記的變數或方法由整個類(所有例項)共享,可不必建立該類物件而直接使用;
static成員也稱類成員或靜態成員;
隨著類的載入而載入;
Java中無靜態類。
1. 修飾屬性
	無論建立多少次物件,都會去共享一個靜態屬性,存在靜態域(在堆中)中和類同一級別
2. 修飾方法
	也是存在靜態域中,可以使用類名.方法名去訪問。
	靜態方法只能訪問靜態成員,如果是非靜態的,應該通過例項化物件的方式
	靜態方法不能以任何方式引用this關鍵字

super()和this()

this:1.當成員變數和區域性變數重名,用關鍵字this來區分
	  2.this代表當前物件,this就是所存函式所屬物件的引用(哪個物件呼叫了this所在的函式,this就代表誰)
	  3.this(引數列表),呼叫本類中過載的構造方法,必須放在第一行。
super:1.使用super呼叫父類的成員方法和屬性
	  2.可以從子類構造方法中呼叫父類的構造方法,必須放在第一行。

equals和==

==:基本型別比較的是值的大小
	引用型別比較的是記憶體地址
equals:預設比較是否是同一個物件
	例如String、Date等類對equals方法進行了重寫的話,比較的是所指向的物件的內容
	注意:equals方法不能作用於基本資料型別的變數

抽象類與介面

抽象類:1.首先有構造方法
	   2.含有抽象方法的類必須被宣告為抽象類
	   3.抽象類不能被例項化,子類必須重寫父類的抽象方法
	   4.abstract不能修飾屬性、構造器、private、static、final
	   5.一般類中不能定義抽象方法;抽象類中可以有抽象方法,也可以有非抽象方法;
	   6.抽象方法只有方法宣告,沒有方法實現。
介面:1.特殊的抽象類;
	   2.介面中包含的方法都是抽象方法,沒有方法體;
	   3.實現介面的類必須實現介面的全部方法。
	   4.屬性:private static final   ;  方法:public abstract
區別:1.抽象類有構造器;介面沒有
	   2.關鍵字不同
	   3.抽象類可以有非抽象方法;介面只能由抽象方法;
	   4.抽象類可以定義static方法;介面不行

Java中的棧與堆

一、Java中的變數在記憶體中的分配
1.類變數(static):在程式載入時系統就為他在堆中開闢了記憶體,堆中的記憶體地址存放在棧中,以便於高速訪問
	靜態變數的週期持續到系統關閉(靜態域)。
2.例項變數:當使用new時,使在堆中開闢相應的記憶體空間。當例項變數的引用丟失後,將被GC列入可回收名單。
3.區域性變數:當執行到他的時候,在棧中開闢記憶體,當局部變數一旦脫離作用域,記憶體立即釋放。
二、堆記憶體用來存放由new建立的物件和陣列,由GC來管理,然後在棧中定義一個特殊的變數,讓棧中的這個變數的取值等於陣列或物件在堆記憶體中的首地址,
	棧中這個變數就成了陣列或物件的引用變數。
三、總結:基本資料型別,區域性變數都是存放在棧記憶體中,用完就消失,沒有預設初始化值。
	new 建立的例項化物件及陣列,是放在堆記憶體中的,用完之後靠GC不定期自動消除;
	堆記憶體中所有實體都有記憶體地址值,有預設初始化值;實體不再被指向時,GC自動清除。
	區域性變數:儲存在棧中,必須顯示的賦值;
	成員變數:儲存在堆中,有預設初始值。

final、finally、finalize

final:
	1.修飾變數:被宣告為final的變數必須在宣告時給出變數的初始值,而在以後的引用中只能讀取。
	2.final宣告方法:方法不能被重寫
	3.修飾類:不能被繼承
finally:在異常處理中作為一個必定會執行的語句塊。
finalize:java技術允許使用finalize方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作

陣列和連結串列的區別

1.儲存位置上:
	陣列邏輯上相鄰的元素在物理儲存位置上也相鄰,而連結串列不一定;
2.儲存空間上:
	陣列是連續的一段記憶體空間;連結串列存放的記憶體空間可以是連續的,也可以不連續的
3.長度可變性:
	陣列長度一旦宣告不可變,連結串列的長度是按照實際需求進行分配的
陣列的優點:隨機訪問性強;查詢速度快;

為什麼提出集合框架

陣列的優點:1.長度不可變;2.存放物件的個數不確定
陣列的缺陷:1.插入和刪除效率低;2.可能浪費記憶體;3.必須有足夠的記憶體空間;4.陣列大小固定
連結串列的優點:1.插入刪除速度快;2.記憶體利用率高;3.可擴充套件
連結串列的缺點:1.不能隨機查詢,必須從第一個開始遍歷,查詢效率低

集合的概述

  • Collection介面
    • List 有序的 可重複的
      • ArrayList
      • LinkedList
      • Vector
    • Set 儲存無序的 不可重複的
      • HashSet
      • LinkedHashSet
      • TreeSet
  • Map 介面 key-value鍵值對
    • HashMap
    • LinkedHashMap
    • TreeMap
    • Hashtable

sleep和wait的區別

sleep() 方法是執行緒類(Thread)的靜態方法,讓呼叫執行緒進入睡眠狀態,讓出執行機會給其他執行緒,
等到休眠時間結束後,執行緒進入就緒狀態和其他執行緒一起競爭cpu的執行時間。
因為sleep() 是static靜態的方法,他不能改變物件的機鎖,當一個synchronized塊中呼叫了sleep() 方法,
執行緒雖然進入休眠,但是物件的機鎖沒有被釋放,其他執行緒依然無法訪問這個物件。
wait()是Object類的方法,當一個執行緒執行到wait方法時,它就進入到一個和該物件相關的等待池,同時釋放物件的機鎖,
使得其他執行緒能夠訪問,可以通過notify,notifyAll方法來喚醒等待的執行緒

執行緒的生命週期

新建
就緒
執行
阻塞
死亡

什麼是執行緒、程序

程序:是程式的一次執行,是具有一定獨立功能的程式關於某個資料集合上的一次運動活動,是作業系統資源分配和排程的最小單位。
執行緒:是作業系統能夠進行運算排程的最小單位,它包含在程序之中,是程序中實際運作單位。
兩者關係:程序是指程式執行時的一個例項,執行緒是程序的一個實體;
	執行緒必定也只數據一個程序,而程序可以擁有多個執行緒而且至少擁有一個執行緒。

執行緒和程序的區別

程序:
	- 擁有獨立的堆疊空間和資料段,系統開銷大
	- 由於程序之間是獨立的特點 使得程序的安全性比較高 有獨立的地址空間 一個程序崩潰 不影響其他程序
	- 程序的通訊機制相對複雜 譬如管道、訊號、訊息佇列、套接字等
執行緒:
	- 執行緒擁有獨立的堆疊空間 但是共享資料段,它們彼此之間使用相同的地址空間,比程序開銷小
	- 執行緒是一個程序中不同的執行路徑 一個執行緒的死亡就等於整個程序的死亡。
	- 通訊相對方便

什麼是執行緒安全、為什麼提出執行緒安全、如何實現?

當一個執行緒在操作共享資源時,未執行完畢的情況下,其他執行緒參與進來,導致共享資源出現安全問題。
方式一:同步程式碼塊
synchronized(同步監視器){
	同步的程式碼
}
同步監視器:可以由任何物件來承擔,針對於實現的方式可以用物件,也可以採用this關鍵字。對於繼承方式 只能採用靜態的物件。
方式二:同步方法
確保當中一個執行緒執行此方法時 其他執行緒等待知道當前執行緒執行完。

Thread 類中的start() 和 run() 方法有什麼區別?

start()方法被用來啟動新建立的執行緒,而且start()內部呼叫了run()方法,這和直接呼叫run()方法的效果不一樣。
當你呼叫run()方法的時候,只會是在原來的執行緒中呼叫,沒有新的執行緒啟動;start()方法才會啟動新執行緒。

Java中notify 和 notifyAll有什麼區別?

notify()方法不能喚醒某個具體的執行緒,所以只有一個執行緒在等待的時候它才有用武之地。
而notifyAll()喚醒所有執行緒並允許他們爭奪鎖確保了至少有一個執行緒能繼續執行。

泛型是什麼?為什麼使用?

簡單的說一種標籤,不確定的型別,使用者使用的時候確定型別,是JDK1.5出現的新特性,用於解決安全問題,是一種型別安全機制。
好處:
	-將執行時期會可能出現的異常轉移到編譯期
	-提高了安全性
	-避免了強制型別轉換的麻煩。

概述反射和序列化

反射:
JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。
序列化:
序列化可以理解成把物件轉換為容易傳輸的格式的過程。

序列化的好處

方便儲存物件。因為物件不能儲存,所以可以序列化,將其儲存。

使用JDBC的過程

1.載入JDBC驅動程式
	Class.forName("com.mysql.jdbc.Driver") ;
2.提供JDBC連線的URL
	jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=utf-8 ;
3.建立資料庫的連線
	Connection con = DriverManager.getConnection(url , username , password )
4.實現PreparedStatement
	PreparedStatement pstmt = con.prepareStatement(sql) ;
5.執行SQL語句
6.處理結果 
	-返回結果集
	-影響的記錄數
7.關閉JDBC物件

資料庫篇

MySql底層採用什麼資料結構來儲存資料?

B-樹、平衡樹

分頁所用的關鍵字

LIMIT

SQL實現資料表的複製

select into from 和 insert into select都是用來複製表.
兩者的主要區別為: 
select into from 要求目標表不存在,因為在插入時會自動建立
insert into select from 要求目標表存在
兩者的語法:
SELECT vale1, value2 into Table2 from Table1
Insert into Table2(field1,field2,...) select value1,value2,... from Table1

什麼是事務

事務(Transaction)是併發控制的基本單位。所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

事物的四大特性

-原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行
-一致性(Consistency):事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態。
-隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行
-永續性(Durability):已被提交的事務對資料庫的修改應該永久儲存在資料庫中

什麼是儲存過程

儲存過程可以說是一個記錄集吧,也可以認為是一個方法,它是由一些SQL語句組成的程式碼塊,
這些SQL語句程式碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然後再給這個程式碼塊取一個名字,在用到這個功能的時候呼叫他就行了。

簡單介紹一下觸發器

觸發器是由 INSERT、UPDATE 和 DELETE 等事件來觸發某種特定操作。
滿足觸發器的觸發條件時,資料庫系統就會執行觸發器中定義的程式語句。這樣做可以保證某些操作之間的一致性。
例如,在執行完一句插入語句時,觸發查詢所有,保證資訊的完整性。

什麼是E-R圖

 ER圖中包含了實體(即資料物件)、關係和屬性3種基本成分;
 通常用矩形框代表實體,用連線相關實體的菱形框表示關係,用橢圓形或圓角矩形表示實體(或關係)的屬性,並用直線把實體(或關係)與其屬性連線起來。
 三種聯絡:
 	- 1:1 例如,一個部門有一個經理,而每個經理只在一個部門任職,則部門與經理的聯絡是一對一的
 	- 1:N 例如,某校教師與課程之間存在一對多的聯絡“教”,即每位教師可以教多門課程,但是每門課程只能由一位教師來教。
 	- M:N 例如,學生與課程間的聯絡(“學”)是多對多的,即一個學生可以學多門課程,而每門課程可以有多個學生來學。

什麼是外連線、內連線?

內連線:根據連線條件只保留兩個表中有對應資料的記錄;
外連線:當一個表中記錄在另一個表中沒有對應記錄時,會生成一條與 NULL 值對應的記錄

什麼是索引?有什麼用?

索引相當於目錄,可以更加方便的用於查詢。

正規化

  • 第一正規化
    • 第一正規化(1NF)要求資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。
    • 若某一列有多個值,可以將該列單獨拆分成一個實體,新實體和原實體間是一對多的關係。
    • 在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。
  • 第二正規化
    • 滿足第二正規化(2NF)必須先滿足第一正規化(1NF)
    • 第二正規化要求實體中沒一行的所有非主屬性都必須完全依賴於主鍵;即:非主屬性必須完全依賴於主鍵。
    • 完全依賴:主鍵可能由多個屬性構成,完全依賴要求不允許存在非主屬性依賴於主鍵中的某一部分屬性。若存在哪個非主屬性依賴於主鍵中的一部分屬性,那麼要將發生部分依賴的這一組屬性單獨新建一個實體,並且在舊實體中用外來鍵與新實體關聯,並且新實體與舊實體間是一對多的關係。
  • 第三正規化
    • 滿足第三正規化(3NF)必須先滿足第二正規化。
    • 第三正規化要求:實體中的屬性不能是其他實體中的非主屬性。因為這樣會出現冗餘。即:屬性不依賴於其他非主屬性。
    • 如果一個實體中出現其他實體的非主屬性,可以將這兩個實體用外來鍵關聯,而不是將另一張表的非主屬性直接寫在當前表中。

資料結構篇

快速排序

氣泡排序

二分查詢

二叉樹的遍歷

有三種遍歷方式:前序、中序、後序
具體遍歷過程可以參考部落格

什麼是紅黑樹

計算機網路篇

TCP和UDP

TCP:面向有連線的,三次握手機制;傳輸的資料大小無限制;安全可靠協議;效率低,區分客戶端和伺服器
UDP:是面向無連線的,傳送的資料是通過資料報包的形式,不超過64k;不安全(可靠)協議,效率高;不區分客戶端和伺服器。(叫傳送端和接收端)

三次握手 四次揮手

三次握手
三次握手

	1.進行三次握手,首先向伺服器傳送一個syn報文,其中syn=1,seq number=1022(隨機)2.伺服器接收到syn報文,根據syn=1判斷客戶端請求建立連線,並返回一個syn報文,為第一次握手,
其中ack number=1023(客戶端seq number+1),seq number=2032(隨機),syn=1,ack=13.客戶端根據伺服器的syn報文,確認其ack number是否與上一次傳送的seq number+1相等,且ack=1,確認正確,則迴應一個ack報文,為第二次握手,
即ack number=2033(伺服器seq number+1),ack=14.伺服器根據接收到的ack報文,確認ack number是否與上一次傳送的seq number+1相等,並且ack=1,確認正確,則建立連線,
進入Established狀態,為第三次握手。

網路的七層協議

網路架構

OSI中的層 功能 TCP/IP協議族
應用層 檔案傳輸、電子郵件、檔案服務等 TFTP、HTTP、FTP、SMTP、DNS、Telnet、SNMP
表示層 資料格式化、程式碼轉換、資料加密
會話層 解除或建立與別的結點的聯絡
傳輸層 提供端對端的介面 TCP、UDP
網路層 為資料包選擇路由 IP、ICMP、OSPF、BGP、ARP、RARP
資料鏈路層 傳輸有地址的幀以及錯誤檢測功能 SLIP、CSLIP、PPP、MTU、ARP、RARP
物理層 以二進位制資料形式在屋裡媒體上傳輸資料 ISO2110、IEEE802、IEEE802.2

當在瀏覽器輸入欄按下回車會發生什麼

1.回車鍵按下後,瀏覽器會對輸入的地址資料進行解析
2.進行DNS(域名伺服器 UDP的)遞迴查詢
3.使用套接字進行資料訪問
4.建立TCP連線(三次握手)
5.瀏覽器處理資料

郵件伺服器之間傳送郵件通常使用什麼協議,它們分別使用哪個埠,簡述其功能。

web篇

表單中get和post區別

get:
	1.不能傳遞敏感資料
	2.不能傳遞大量的資料,每次只能傳遞1024B
	3.不能上傳附件
post:
	1.相對安全
	2.可以上傳海量資料
	3.可以上傳附件

什麼是Ajax,好處是什麼

通過在後臺與伺服器進行少量資料交換,AJAX 可以使網頁實現非同步更新。
這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。

九大內建物件

out
page
pageContext
request
response
session
application
exception
config

cookie和session的區別

cookie:使用客戶端保持http狀態資訊(儲存在客戶端)
	由web伺服器在http響應頭中附帶給瀏覽器
	一旦瀏覽器儲存了cookie 每次訪問web伺服器時 都會在http請求頭中將cookie回傳給web伺服器
session:採用的是在服務端保持Http狀態資訊的方案(儲存在服務端)
	當服務端需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否包含了一個session標識(即JSESSIONID)

你瞭解監聽器嗎

框架篇(這裡只涉及SSM)

什麼是ORM

物件關係對映(Object Relational Mapping)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的技術 ;
簡單的說, ORM是通過使用描述物件和資料庫之間的對映的元資料,將程式中的物件自動持久化到關係資料庫中

MyBatis預設用什麼做日誌管理

log4j

MyBatis動態代理

為什麼使用Druid(德魯伊),不使用c3p0

史上最好的data source,有一個監控面板
	- 可以監控每條sql語句的使用次數、執行效率,
	- url的監控,請求時間、併發等,
	- 也能監控session

簡單介紹Spring

spring是一個輕量級的控制反轉和麵向切面程式設計的容器框架
1.輕量級:spring大小和開銷都是輕量級的
2.非入侵:一般在程式開發中,不需要引入spring包
3.控制反轉(IOC):把物件的建立權力交給容器
4.面向切面程式設計(AOP):基於代理的 可以將核心業務和系統服務分開

Spring的兩大特性

1.控制反轉 : 把物件的建立、銷燬的權利交給容器框架,由容器來管理物件的生命週期;
	ioc不是新的技術 只是一種思想或理念。可以實現鬆耦合!
	ioc包括依賴注入(DI,核心) 和 依賴查詢;
		DI:依賴注入 就是在spring例項化物件的時候,由容器來設定這些物件的屬性值。
2.面向切面程式設計:採用橫向抽取機制,把分散在各個方法中的相同的程式碼抽取出來,
	然後再編譯期或者是執行時再把這些程式碼應用到所需要執行的地方。
	通知(Advice):aop在切點上執行的增強處理。
	切點(Pointcut):就是帶有通知的連線點。
	切面(Aspect):通常上就是一個類,裡面定義了 通知和切點。
	AOP=通知+切點

什麼是MVC

MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫.
Model(模型)是應用程式中用於處理應用程式資料邏輯的部分。通常模型物件負責在資料庫中存取資料。
View(檢視)是應用程式中處理資料顯示的部分。通常檢視是依據模型資料建立的。
Controller(控制器)是應用程式中處理使用者互動的部分。通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。

SpringMVC的工作流程

SpringMVC

客戶端傳送url到 前端控制器DispatcherServlet
前端控制器把請求url傳送給 處理器對映器HandlerMapping
處理器對映器 根據請求的url來查詢 處理器Handler,並返回給 前端控制器
前端控制器 呼叫 處理器介面卡 去執行 處理器,傳遞需要執行的處理器資訊
處理器介面卡 執行 處理器
處理器 返回一個 ModelAndView物件
介面卡返回ModelAndView給 前端控制器
前端控制器 呼叫 檢視解析器 去解析檢視
檢視解析器 把邏輯檢視解析為真正的檢視並且返回給 前端控制器 
前端控制器 對檢視進行資料渲染、構建DOM樹
把頁面返回給客戶端。

宣告

以上試題均為原題,來自各個企業校招筆試面試,僅供參考學習。