概念1:
try-catch-finally塊中,finally塊在以下幾種情況將不會執行。
(1)finally塊中發生了異常。
(2)程序所在線程死亡。
(3)在前面的代碼中用了System.exit();
(4)關閉了CPU
概念2:
泛型是什麼?
答:泛型主要解決安全和代碼重用率的問題,它有自動裝箱和拆箱的功能。利用與一個不確定的類型來表示任意一個類型,而且泛型通過一個反射機制可以獲得這個類的一系列信息,從而提高代碼的優越性。
概念3:
Java中的前期綁定和後期綁定
答:前期綁定指在編譯時即能確定的類型。
後期綁定指在編譯時不確定類型,在運行時確定類型。
概念4:
面向對象
答:首先:面向對象是一種思想,基於面向過程,可以將複雜問題簡單化。其次:它使我們從執行者變爲了指揮者,比如說公司現在就是在用面向對象的思維來思考解決問題。公司招人,說明公司在發展壯大,需要一些具備專業編程的人來做事情,從而實現公司的盈利。而我就是那個具備編程能力的對象,所以這就是一種面向對象的思想。
概念5:
static和final變量:
答:static如果沒有初值,默認是0;final變量則必須賦初值。
概念6:
String,StringBuffer以及StringBuilder之間的關係
(1)線程安全
StringBuffer 線程安全
StringBuilder 線程不安全
(2)速度
一般情況下,速度從快到慢:StringBuilder>StringBuffer>String,這種比較是相對的,不是絕對的。
(3)總結
如果要操作少量的數據用 = String
單線程操作字符串緩衝區 下操作大量數據 = StringBuilder
多線程操作字符串緩衝區 下操作大量數據 = StringBuffer
概念7:
HTTPS和HTTP的區別
答:超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提 供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息, 比如信用卡號、密碼等。爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。
區別如下:
(1)https協議需要到ca申請證書,一般免費證書很少,需要交費。
(2)http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
(3)http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
(4)http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
概念8:
for循環的判斷
(1)for(int i=5, j=10; i<10; i++){ } 此語句不會發生編譯錯誤。
(2)int i;
for(i=5, int j=10; i<10;i++, j++){ } 此語句將發生編譯錯誤。
(3)for(int i=5,j=10; i<10,j>5; i++){ } 此語句將發生編譯錯誤,因爲語句2的返回值必須爲true或者false。
概念9:
Java數據類型
java數據類型圖: ┏數值型━┳━整數型:byte short int long ┏基本數據類 型<strong>-------</strong>┫ ┗━浮點型:float double ┃ ┣字符型:char 數據類型------╋ ┗布爾型:boolean ┃ ┏類(class) ┗引用數據類型━━╋接口(interface) ┗數組(array)
引用類型 就是在變量中存儲的不是值而是一個內存中的地址的數據類型。也就是說 變量中存儲了這個變量的值所在內存中的地址 每次調用這個變量都是引用這個地址而得到真正的值 所以叫引用類型。
概念10:
Java常見的異常類型:
數組角標越界,空指針異常類,算術異常,字符串轉換爲數字異常,類型不存在異常
概念11:
Java中常見的四種監聽方式:
(1)讓包含“事件源”的容器對象來擔任監聽者。即jb.addActionListener(this);this指代一個JFrame對象。
(2)定義內部類來擔任監聽者。
(3)使用匿名內部類來擔任監聽者。
jb.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
(4)使用外部類來實現監聽。
概念12:
Java中爲什麼會出現空指針異常?
(1)所謂的指針,就是java中的對象的引用。比如String s;這個s就是指針。
(2)所謂的空指針,就是指針的內容爲空,比如上面的s,如果令它指向nul了,就是空指針。
(3)所謂的空指針異常,就是一個指針是空指針,你還要去操作它,既然它指向的是空對象,它就不能使用這個對象的方法。比如上面的s假如爲null,你還要用s的方法,比如s.wait(1000);那麼就會產生空指針異常。
概念13:
Java是解釋型還是編譯型語言?
答:Java比較特殊,.java文件經過編譯之後,再利用解釋的方式在運行。
即,經過編譯之後形成了字節碼文件(.class)文件,字節碼文件可以跨平臺運行。其可以在任何一種操作系統中的任何一個JVM上來被解釋運行,即JVM是一個字節碼解釋器。
所以,Java先編譯,再解釋。
概念14:
靜態和非靜態的區別:
答:(1)首先靜態方法中只能有靜態成員變量,不能有非靜態的普通成員變量。
非靜態方法中,沒有限制。
(2)其次,在訪問方式上。 靜態方法只能訪問靜態方法,不能訪問非靜態的普通方法。
非靜態方法則沒有限制。
概念15:
接口與抽象類的區別:
答:(1)接口裏得數據成員必須是靜態的,而且必須被初始化。
(2)接口裏得方法必須全部爲abstract(即全爲抽象方法)。
16、foreach語句即增強for循環的使用。
優點:代碼整潔,減少了代碼量。
缺點:只可以單純的遍歷數組和集合,不可以操作。
舉例如下:
17、變量的表面類型和實際類型
在Java中,只要定義變量就必然要有類型,一個變量可以有兩種類型:表面類型和實際類型。表面類型是在定義的時候賦予的類型,實際類型是對象的類型。
如代碼中所示:主函數中對象p的表面類型是接口Person類型的,但是其實際類型是類People類型的。
18、數據結構
各種數據結構所表示的即和特點說明如下:
(1)線性表表示可重複的無序集合,元素間具有前驅和後繼次序關係;不同元素的關鍵字可以重複,採用序號能夠識別關鍵字重複的數據元素。
(2)排序線性表表示可重複的排序集合,元素按關鍵字的大小次序排序。
(3)散列表表示不可重複的無序集合,元素關鍵字不可重複,元素間沒有次序,不排序。
(4)二叉排序樹表示不可重複的排序集合,元素關鍵字不重複,元素按關鍵字升/降序排序。
19、模板方法模式
模板方法模式就是在模板方法中按照一定的規則和順序調用基本方法。
20、排序算法總結
(1)冒泡排序,直接插入排序以及直接選擇排序算法的時間複雜度爲O(n2),這些排序算法簡單易懂,思路清晰,算法結構爲兩重循環,共進行n-1趟,每趟排序將一個元素移動到排序後的位置。數據比較和移動在相鄰兩個元素之間進行,每趟排序與上一趟之間存在較多重複的比較、移動和交換,因此排序效率較低。
(2)希爾排序、快速排序以及堆排序、歸併排序效率較高。其共同特點爲:與相鄰較遠的元素進行比較,數據移動距離較遠,跳躍式的向目的地前進,避免了許多重複的比較和數據移動。
21、Java字節流和字符流的區別
(1)字節流操作字節(8位),字符流操作字符(2個字節,16位)。
(2)字節流不進行close操作,仍然可以輸出。
字符流則必須進行close操作才能輸出。因爲字符流使用了緩衝區,沒有close關閉字符流時,也可以使用flush操作來強行將緩衝區數據輸出。
22、js裏邊是否存在函數重載?
答:(1)js裏邊不存在重載。
(2)但是可以使用別的方法來模擬函數重載的效果。利用arguments數組,判斷接收到幾個參數,然後執行相應的操作,實現重載的效果。
23、工廠方法模式和抽象工廠模式的區別:
答:工廠方法模式是一種極端情況的抽象工廠模式,而抽象工廠模式可以看成是工廠方法模式的一種推廣。
(1)、其實工廠方法模式是用來創建一個產品的等級結構的,而抽象工廠模式是用來創建多個產品的等級結構的。工廠方法創建一般只有一個方法,創建一種產品。抽象工廠一般有多個方法,創建一系列產品。
(2)、工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。工廠方法模式的具體工廠類只能創建一個具體產品類的實例,而抽象工廠模式可以創建多個。
簡而言之->
工廠方法模式: 一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式: 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
24、簡單工廠模式和工廠方法模式的區別:
答:簡單工廠模式將抽象工廠類去掉,並且將具體工廠類中的方法設置爲靜態的。這樣可以直接通過類來調用方法,即不需要將該工廠創建出來。是一種工廠方法模式的弱化模式,其不符合開閉原則,但是仍然是一種極其好用的設計模式。
25、數組有沒有length()方法?String有沒有length()方法?
答:數組沒有length()方法,有length 的屬性。String
有length()方法。JavaScript中,獲得字符串的長度是通過length屬性得到的,這一點容易和Java混淆。
26、爲什麼不可以以返回值區分重載方法?
如下兩個方法:
void f(){}
int f(){ return 1;}
只要編譯器可以根據語境明確判斷出語義,比如在int x = f();中,那麼的確可以據此區分重載方法。不過,有時你並不關心方法的返回值,你想要的是方法調用的其他效果(這常被稱爲“爲了副作用而調用”),這時你可能會調用方法而忽略其返回值,所以如果像下面的調用:
fun();
此時Java如何才能判斷調用的是哪一個 f() 呢?別人如何理解這種代碼呢?所以,根據方法返回值來區分重載方法是行不通的。
以上參考《Java 編程思想》
27、Session的相關方法比較
答:request.getSession(false)、request.getSession(true)、request.getSession()
後兩個方法效果相同,第一個方法:如果session緩存中(如果cookie不存在),不存在session,那麼返回null,而不會創建session對象。也就是說使用第一個方法不一定能夠得到一個Session。
28、JavaWeb中配置錯誤頁面的方式:
答:(1)通過jsp的page指令的屬性errorpage和iserrorpage來設置。
<%@ page errorPage="b.jsp"%> <%@page isErrorPage="true" %>
(2)在web.xml中配置錯誤頁面。
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
29、<%@include>和<jsp:include>有什麼不同?
答:前者爲JSP靜態包含指令,後者爲JSP的動作標籤之一:動態標籤。
前者將兩個JSP頁面合併起來,生成一個Java文件; 後者分別生成各自的java文件,最後將結果合併輸出。
30、JSP相關:
(1)JSP三大指令:
page指令的常用屬性有:import,language, PageEncoding, ContentType, errorPage, isErrorpPage等
include指令:靜態包含。
taglib指令:導入標籤庫。
(2)JSP的九大內置對象:
在JSP中無需創建就可以使用的9個對象,它們是:
out(JspWriter):等同與response.getWriter(),用來向客戶端發送文本數據;
config(ServletConfig):對應“真身”中的ServletConfig;
page(當前JSP的真身類型):當前JSP頁面的“this”,即當前對象;
pageContext(PageContext):頁面上下文對象,它是最後一個沒講的域對象;
exception(Throwable):只有在錯誤頁面中可以使用這個對象;
request(HttpServletRequest):即HttpServletRequest類的對象;
response(HttpServletResponse):即HttpServletResponse類的對象;
application(ServletContext):即ServletContext類的對象;
session(HttpSession):即HttpSession類的對象,不是每個JSP頁面中都可以使用,如果在某個JSP頁面中設置<%@page session=”false”%>,說明這個頁面不能使用session。
在這9個對象中有很多是極少會被使用的,例如:config、page、exception基本不會使用。
在這9個對象中有兩個對象不是每個JSP頁面都可以使用的:exception、session。
(3)JSP的動作標籤:
動作標籤用來簡化java腳本,JavaWeb提供了20個JSP的動作標籤,常用的有:
include標籤 forward標籤 以及子標籤param標籤用來傳遞參數。
(4)javaBean規範:
必須有默認的無參構造器,必須提供getter/setter方法。其中屬性和成員變量是不同的。可以沒有這個成員變量,但是getter/setter後面的這個就叫屬性。
(5)EL表達式:
全域查找:${xxx},全域查找名爲xxx的屬性,如果不存在,輸出空字符串,而不是null。
選擇一個查找範圍:${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域獲取屬性!
EL表達式11大內置對象:pageScope,requestScope,sessionScope,applicationScope,header,headerValues,param,paramValues,initParam,cookie
pageContext(一個頂N個)
其中前10個都是Map類型的,cookie的鍵爲String類型,Value爲Cookie類型。
31、加載驅動方法
3.System.setProperty("jdbc.drivers", "com.MySQL.jdbc.Driver"); 通過添加系統的jdbc.drivers屬性
32、接口中的數據類型和方法類型
publicinterface
IService {
String NAME=
"default"
;
} 的默認數據類型等價於:public static final String NAME=“default” ;
接口中的變量默認是public static final 的,方法默認是public abstract 的
33、equals和==的區別:
34、Java虛擬機JVM的功能:
(1)通過 ClassLoader 尋找和裝載 class 文件
(2)解釋字節碼成爲指令並執行,提供 class 文件的運行環境
(3)進行運行期間垃圾回收
(4)提供與硬件交互的平臺
35、會話跟蹤技術:
(1)Cookie是Web服務器發送給客戶端的一小段信息,客戶端請求時,可以讀取該信息發送到服務器端
(2)關閉瀏覽器意味着會話ID丟失,但所有與原會話關聯的會話數據仍保留在服務器上,直至會話過期
(3)在禁用Cookie時可以使用URL重寫技術跟蹤會話
36、java 類加載器
(1)引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫,是用原生代碼來實現的
(2)擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫。
(3)系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類
(4)tomcat 爲每個 App 創建一個 Loader,裏面保存着此 WebApp 的 ClassLoader。需要加載 WebApp 下的類時,就取出 ClassLoader 來使用
37、以下代碼輸出結果爲:(C)
A Compilation error because”~”doesn’t operate on integers
B -5
C -6
D 15
解析:很有趣的一個符號,以前沒有見過。。。。。。 涉及到補碼等知識,公式:~j=-j-1
38、標準輸入輸出流:
一般用(System.in)創建InputStream對象,表示從標準輸入中獲取數據,用(System.out)創建OutputStream對象,表示輸出到標準輸出設備中。
39、關於運算時的類型問題:
以上的代碼片段敘述正確的爲(C)
A 輸出結果:13
B 語句:b6=b4+b5編譯出錯
C 語句:b3=b1+b2編譯出錯
D 運行期拋出異常
解析:
被final修飾的變量是常量,這裏的b6=b4+b5可以看成是b6=10;在編譯時就已經變爲b6=10了
而b1和b2是byte類型,java中進行計算時候將他們提升爲int類型,再進行計算,b1+b2計算後已經是int類型,賦值給b3,b3是byte類型,類型不匹配,編譯不會通過,需要進行強制轉換。
Java中的byte,short,char進行計算時都會提升爲int類型。
40、HashMap解決哈希衝突的方法:
HashMap通過開放地址法解決哈希衝突 錯
解析:
鏈表法就是將相同hash值的對象組織成一個鏈表放在hash值對應的槽位;開放地址法是通過一個探測算法,當某個槽位已經被佔據的情況下繼續查找下一個可以使用的槽位。很顯然我們使用的不是開放地址法。
41、併發與並行的區別與聯繫:
併發:在 操作系統 中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個 處理機 上運行。
並行:在單處理器中多道程序設計系統中,進程被交替執行,表現出一種併發的外部特性;在多處理器系統中,進程不僅可以交替執行,而且可以重疊執行。在多處理器上的程序纔可實現並行處理。從而可知,並行是針對多處理器而言的。並行是同時發生的多個併發事件,具有併發的含義,但併發不一定並行,也亦是說併發事件之間不一定要同一時刻發生。
舉例:
42、Struts1和Struts2的區別:
從action類上分析:
1.Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
2. Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
從Servlet 依賴分析:
3. Struts1 Action 依賴於Servlet API ,因爲當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
4. Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest
和 HttpServletResponse的必要性。
從action線程模式分析:
5. Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。
6. Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)
43、非線性數據結構和線性數據結構:
常見的非線性結構有:二維數組,多維數組,廣義表,樹(二叉樹等),圖。
44、8中基本數據類型的默認初始值
45、Java標識符:
46、靜態static方法竟然可以這麼玩。。。
以下程序能正確輸出。
若testMethod( )方法爲非靜態方法,則報錯:空指針異常。。。
47、Java初始化順序:
49、Java中的異常相關概念:
throw用於在方法內拋出異常對象。
throws關鍵字用於在方法上拋出異常。
try是用於檢測被包住的語句塊是否出現異常,如果有異常,則拋出異常,並執行catch語句。
finally語句塊是不管有沒有出現異常都要執行的內容。
50、靜態內部類和非靜態內部類創建對象的區別: