大數(shù)據(jù)面試題(一)
本題集由尚學(xué)堂學(xué)員整理,列舉了眾多IT公司面試真題,對應(yīng)聘Java程序員職位的常見考點和知識體系都進行的分類和歸納整理。
本題集適合應(yīng)聘Java和JavaEE職位的程序員作為面試復(fù)習(xí)、學(xué)習(xí)和強化的資料,也適合其他程序員作為拓展讀物進行閱讀。
本題集包含了常見的算法、面試題,也包含了新的高級技術(shù),比如:微服務(wù)架構(gòu)等技術(shù)的面試題目。本題集非常全面,對于工作1-5年左右的java程序員面試有非常好的指導(dǎo)作用。
1.大學(xué)生高端復(fù)合人才成長
JAVA專業(yè),1000課
3.大數(shù)據(jù)專業(yè),500課?
?4.人工智能專業(yè),500課
Python專業(yè),500課
四個專業(yè)都要學(xué),從零開始2000小時,成為高端人才,打下一生技術(shù)基礎(chǔ),不再是低端碼農(nóng)。

Java基礎(chǔ)、語法:
1.Java跨平臺原理(字節(jié)碼文件、虛擬機)

C/C++語言都直接編譯成針對特定平臺機器碼。如果要跨平臺,需要使用相應(yīng)的編譯器重新編譯。
Java源程序(.java)要先編譯成與平臺無關(guān)的字節(jié)碼文件(.class),然后字節(jié)碼文件再解釋成機器碼運行。解釋是通過Java虛擬機來執(zhí)行的。
字節(jié)碼文件不面向任何具體平臺,只面向虛擬機。
Java虛擬機是可運行Java字節(jié)碼文件的虛擬計算機。不同平臺的虛擬機是不同的,但它們都提供了相同的接口。
Java語言具有一次編譯,到處運行的特點。就是說編譯后的.class可以跨平臺運行,前提是該平臺具有相應(yīng)的Java虛擬機。但是性能比C/C++要低。
Java的跨平臺原理決定了其性能沒有C/C++高

2.Java的安全性
語言層次的安全性主要體現(xiàn)在:
Java取消了強大但又危險的指針,而代之以引用。由于指針可進行移動運算,指針可隨便指向一個內(nèi)存區(qū)域,而不管這個區(qū)域是否可用,這樣做是危險的,因為原來這個內(nèi)存地址可能存儲著重要數(shù)據(jù)或者是其他程序運行所占用的,并且使用指針也容易數(shù)組越界。
垃圾回收機制:不需要程序員直接控制內(nèi)存回收,由垃圾回收器在后臺自動回收不再使用的內(nèi)存。避免程序忘記及時回收,導(dǎo)致內(nèi)存泄露。避免程序錯誤回收程序核心類庫的內(nèi)存,導(dǎo)致系統(tǒng)崩潰。
異常處理機制:Java異常機制主要依賴于try、catch、finally、throw、throws五個關(guān)鍵字。
強制類型轉(zhuǎn)換:只有在滿足強制轉(zhuǎn)換規(guī)則的情況下才能強轉(zhuǎn)成功。
底層的安全性可以從以下方面來說明
Java在字節(jié)碼的傳輸過程中使用了公開密鑰加密機制(PKC)。
在運行環(huán)境提供了四級安全性保障機制:
字節(jié)碼校驗器 -類裝載器 -運行時內(nèi)存布局 -文件訪問限制
3.Java三大版本
Java2平臺包括標(biāo)準(zhǔn)版(J2SE)、企業(yè)版(J2EE)和微縮版(J2ME)三個版本:
Standard Edition(標(biāo)準(zhǔn)版) J2SE 包含那些構(gòu)成Java語言核心的類。
比如:數(shù)據(jù)庫連接、接口定義、輸入/輸出、網(wǎng)絡(luò)編程
Enterprise Edition(企業(yè)版) J2EE 包含J2SE 中的類,并且還包含用于開發(fā)企業(yè)級應(yīng)用的類。
比如servlet、JSP、XML、事務(wù)控制
Micro Edition(微縮版) J2ME 包含J2SE中一部分類,用于消費類電子產(chǎn)品的軟件開發(fā)。
比如:呼機、智能卡、手機、PDA、機頂盒
他們的范圍是:J2SE包含于J2EE中,J2ME包含了J2SE的核心類,但新添加了一些專有類
應(yīng)用場合,API的覆蓋范圍各不相同。
4.什么是JVM?什么是JDK? 什么是JRE?
JVM :JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是整個java實現(xiàn)跨平臺的最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執(zhí)行,也就是說class并不直接與機器的操作系統(tǒng)相對應(yīng),而是經(jīng)過虛擬機間接與操作系統(tǒng)交互,由虛擬機將程序解釋給本地系統(tǒng)執(zhí)行。JVM是Java平臺的基礎(chǔ),和實際的機器一樣,它也有自己的指令集,并且在運行時操作不同的內(nèi)存區(qū)域。?JVM通過抽象操作系統(tǒng)和CPU結(jié)構(gòu),提供了一種與平臺無關(guān)的代碼執(zhí)行方法,即與特殊的實現(xiàn)方法、主機硬件、主機操作系統(tǒng)無關(guān)。JVM的主要工作是解釋自己的指令集(即字節(jié)碼)到CPU的指令集或?qū)?yīng)的系統(tǒng)調(diào)用,保護用戶免被惡意程序騷擾。?JVM對上層的Java源文件是不關(guān)心的,它關(guān)注的只是由源文件生成的類文件(.class文件)。
JRE:JRE是java runtime environment(java運行環(huán)境)的縮寫。光有JVM還不能讓class文件執(zhí)行,因為在解釋class的時候JVM需要調(diào)用解釋所需要的類庫lib。在JDK的安裝目錄里你可以找到j(luò)re目錄,里面有兩個文件夾bin和lib,在這里可以認(rèn)為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和lib和起來就稱為jre。所以,在你寫完java程序編譯成.class之后,你可以把這個.class文件和jre一起打包發(fā)給朋友,這樣你的朋友就可以運行你寫程序了(jre里有運行.class的java.exe)。JRE是Sun公司發(fā)布的一個更大的系統(tǒng),它里面就有一個JVM。JRE就與具體的CPU結(jié)構(gòu)和操作系統(tǒng)有關(guān),是運行Java程序必不可少的(除非用其他一些編譯環(huán)境編譯成.exe可執(zhí)行文件……),JRE的地位就象一臺PC機一樣,我們寫好的Win32應(yīng)用程序需要操作系統(tǒng)幫我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。?
JDK:JDK是java development kit(java開發(fā)工具包)的縮寫。每個學(xué)java的人都會先在機器上裝一個JDK,那 讓我們看一下JDK的安裝目錄。在目錄下面有六個文件夾、一個src類庫源碼壓縮包、和其他幾個聲明文件。其中,真正在運行java時起作用的是以下四個文件夾:bin、include、lib、jre?,F(xiàn)在我們可以看出這樣一個關(guān)系,JDK包含JRE,而JRE包含JVM。
bin:最主要的是編譯器(javac.exe)
include:java和JVM交互用的頭文件
lib:類庫??????
jre:java運行環(huán)境?
(注意:這里的bin、lib文件夾和jre里的bin、lib是不同的)總的來說JDK是用于java程序的開發(fā),而jre則是只能運行class而沒有編譯的功能。eclipse、idea等其他IDE有自己的編譯器而不是用JDK?bin目錄中自帶的,所以在安裝時你會發(fā)現(xiàn)他們只要求你選jre路徑就ok了。
JDK,JRE,JVM三者關(guān)系概括如下:
jdk是JAVA程序開發(fā)時用的開發(fā)工具包,其內(nèi)部也有JRE運行環(huán)境JRE。JRE是JAVA程序運行時需要的運行環(huán)境,就是說如果你光是運行JAVA程序而不是去搞開發(fā)的話,只安裝JRE就能運行已經(jīng)存在的JAVA程序了。JDk、JRE內(nèi)部都包含JAVA虛擬機JVM,JAVA虛擬機內(nèi)部包含許多應(yīng)用程序的類的解釋器和類加載器等等。
5.Java三種注釋類型
共有單行注釋、多行注釋、文檔注釋3種注釋類型。使用如下:
單行注釋,采用“//”方式.只能注釋一行代碼。如://類成員變量
多行注釋,采用“/*...*/”方式,可注釋多行代碼,其中不允許出現(xiàn)嵌套。如:
/*System.out.println("a");
System.out.println("b");
System.out.println("c");*/
文檔注釋,采用“/**...*/”方式。如:
/**
* 子類 Dog
* @author Administrator
**/
public class Dog extends Animal{}
6.8種基本數(shù)據(jù)類型及其字節(jié)數(shù)
數(shù)據(jù)類型關(guān)鍵字字節(jié)數(shù)數(shù)值型整數(shù)型byte1short2int4long8浮點型float4double8布爾型boolean1(位)字符型char2
7.i++和++i的異同之處
共同點:
1、i++和++i都是變量自增1,都等價于i=i+1
2、如果i++,++i是一條單獨的語句,兩者沒有任何區(qū)別
3、i++和++i的使用僅僅針對變量。 5++和++5會報錯,因為5不是變量。
不同點:

&和&&的聯(lián)系(共同點):
&和&&都可以用作邏輯與運算符,但是要看使用時的具體條件來決定。
操作數(shù)1&操作數(shù)2,操作數(shù)1&&操作數(shù)2,
表達式1&表達式2,表達式1&&表達式2,
情況1:當(dāng)上述的操作數(shù)是boolean類型變量時,&和&&都可以用作邏輯與運算符。
情況2:當(dāng)上述的表達式結(jié)果是boolean類型變量時,&和&&都可以用作邏輯與運算符。
表示邏輯與(and),當(dāng)運算符兩邊的表達式的結(jié)果或操作數(shù)都為true時,整個運算結(jié)果才為true,否則,只要有一方為false,結(jié)果都為false。
8.&和&&的區(qū)別(不同點):
(1)、&邏輯運算符稱為邏輯與運算符,&&邏輯運算符稱為短路與運算符,也可叫邏輯與運算符。
對于&:無論任何情況,&兩邊的操作數(shù)或表達式都會參與計算。
對于&&:當(dāng)&&左邊的操作數(shù)為false或左邊表達式結(jié)果為false時,&&右邊的操作數(shù)或表達式將不參與計算,此時最終結(jié)果都為false。
綜上所述,如果邏輯與運算的第一個操作數(shù)是false或第一個表達式的結(jié)果為false時,對于第二個操作數(shù)或表達式是否進行運算,對最終的結(jié)果沒有影響,結(jié)果肯定是false。推介平時多使用&&,因為它效率更高些。
、&還可以用作位運算符。當(dāng)&兩邊操作數(shù)或兩邊表達式的結(jié)果不是boolean類型時,&用于按位與運算符的操作。
|和||的區(qū)別和聯(lián)系與&和&&的區(qū)別和聯(lián)系類似
9.用最有效率的方法算出2乘以8等于多少
使用位運算來實現(xiàn)效率最高。位運算符是對操作數(shù)以二進制比特位為單位進行操作和運算,操作數(shù)和結(jié)果都是整型數(shù)。對于位運算符“<<”, 是將一個數(shù)左移n位,就相當(dāng)于乘以了2的n次方,那么,一個數(shù)乘以8只要將其左移3位即可,位運算cpu直接支持的,效率最高。所以,2乘以8等于幾的最效率的方法是2 << 3
10.基本數(shù)據(jù)類型的類型轉(zhuǎn)換規(guī)則
基本類型轉(zhuǎn)換分為自動轉(zhuǎn)換和強制轉(zhuǎn)換。
自動轉(zhuǎn)換規(guī)則:容量小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成容量大的數(shù)據(jù)類型,也可
以說低級自動向高級轉(zhuǎn)換。這兒的容量指的不是字節(jié)數(shù),而是指類型表述的范圍。

強制轉(zhuǎn)換規(guī)則:高級變?yōu)榈图壭枰獜娭妻D(zhuǎn)換。
如何轉(zhuǎn)換:
(1)賦值運算符“=”右邊的轉(zhuǎn)換,先自動轉(zhuǎn)換成表達式中級別最高的數(shù)據(jù)類型,再進行運算。
(2)賦值運算符“=”兩側(cè)的轉(zhuǎn)換,若左邊級別>右邊級別,會自動轉(zhuǎn)換;若左邊級別 == 右邊級別,不用轉(zhuǎn)換;若左邊級別 < 右邊級別,需強制轉(zhuǎn)換。
(3)可以將整型常量直接賦值給byte, short, char等類型變量,而不需要進行強制類型轉(zhuǎn)換,前提是不超出其表述范圍,否則必須進行強制轉(zhuǎn)換。
11.if多分支語句和switch多分支語句的異同之處
相同之處:都是分支語句,多超過一種的情況進行判斷處理。
不同之處:
switch更適合用于多分支情況,就是有很多種情況需要判斷處理,判斷條件類型單一,只有一個入口,在分支執(zhí)行完后(如果沒有break跳出),不加判斷地執(zhí)行下去;而if—elseif---else多分枝主要適用于分支較少的分支結(jié)構(gòu),判斷類型不是單一,只要一個分支被執(zhí)行后,后邊的分支不再執(zhí)行。switch為等值判斷(不允許比如>= <=),而if為等值和區(qū)間都可以,if的使用范圍大。
12.while和do-while循環(huán)的區(qū)別
while先判斷后執(zhí)行,第一次判斷為false,循環(huán)體一次都不執(zhí)行
do while先執(zhí)行 后判斷,最少執(zhí)行1次。
如果while循環(huán)第一次判斷為true, 則兩種循環(huán)沒有區(qū)別。
13.break和continue的作用
break: 結(jié)束當(dāng)前循環(huán)并退出當(dāng)前循環(huán)體。
break還可以退出switch語句
continue: 循環(huán)體中后續(xù)的語句不執(zhí)行,但是循環(huán)沒有結(jié)束,繼續(xù)進行循環(huán)條件的判斷(for循環(huán)還會i++)。continue只是結(jié)束本次循環(huán)。
14.請使用遞歸算法計算n!

15.遞歸的定義和優(yōu)缺點
遞歸算法是一種直接或者間接地調(diào)用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易于理解。
遞歸算法解決問題的特點:
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但運行效率較低。所以一般不提倡用遞歸算法設(shè)計程序。
(4) 在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數(shù)過多容易造成棧溢出等。所以一般不提倡用遞歸算法設(shè)計程序。
16.數(shù)組的特征
數(shù)組是(相同類型數(shù)據(jù))的(有序)(集合)
數(shù)組會在內(nèi)存中開辟一塊連續(xù)的空間,每個空間相當(dāng)于之前的一個變量,稱為數(shù)組的元素element
元素的表示 數(shù)組名[下標(biāo)或者索引] scores[7] scores[0] scores[9]
索引從0開始
每個數(shù)組元素有默認(rèn)值 double 0.0 boolean false int 0
數(shù)組元素有序的,不是大小順序,是索引 的順序
數(shù)組中可以存儲基本數(shù)據(jù)類型,可以存儲引用數(shù)據(jù)類型;但是對于一個數(shù)組而言,數(shù)組的類型是固定的,只能是一個
length:數(shù)組的長度
數(shù)組的長度是固定的,一經(jīng)定義,不能再發(fā)生變化(數(shù)組的擴容)
17.請寫出冒泡排序代碼

18.請寫出選擇排序的代碼

19.請寫出插入排序的代碼

20.可變參數(shù)的作用和特點
總結(jié)1:可變參數(shù)
1.可變參數(shù)的形式 ...
2.可變參數(shù)只能是方法的形參
3.可變參數(shù)對應(yīng)的實參可以0,1,2.....個,也可以是一個數(shù)組
4.在可變參數(shù)的方法中,將可變參數(shù)當(dāng)做數(shù)組來處理
5.可變參數(shù)最多有一個,只能是最后一個
6.可變參數(shù)好處:方便 簡單 減少重載方法的數(shù)量
7.如果定義了可變參數(shù)的方法,不允許同時定義相同類型數(shù)組參數(shù)的方法
總結(jié)2:數(shù)組做形參和可變參數(shù)做形參聯(lián)系和區(qū)別
聯(lián)系:
1.實參都可以是數(shù)組;2.方法體中,可變參數(shù)當(dāng)做數(shù)組來處理
區(qū)別:
1.個數(shù)不同 可變參數(shù)只能有一個數(shù)組參數(shù)可以多個
2.位置不同 可變參數(shù)只能是最后一個 數(shù)組參數(shù)位置任意
3.實參不同 可變參數(shù)實參可以0,1,2.....個,也可以是一個數(shù)組,數(shù)組的實參只能是數(shù)組
21.類和對象的關(guān)系
類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。類是用于創(chuàng)建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。
類和對象好比圖紙和實物的關(guān)系,模具和鑄件的關(guān)系。
比如人類就是一個概念,人類具有身高,體重等屬性。人類可以做吃飯、說話等方法。
小明就是一個具體的人,也就是實例,他的屬性是具體的身高200cm,體重180kg,他做的方法是具體的吃了一碗白米飯,說了“12345”這樣一句話。
22.面向過程和面向?qū)ο蟮膮^(qū)別
兩者都是軟件開發(fā)思想,先有面向過程,后有面向?qū)ο?。在大型項目中,針對面向過程的不足推出了面向?qū)ο箝_發(fā)思想。

比喻
蔣介石和毛澤東分別是面向過程和面向?qū)ο蟮慕艹龃?,這樣充分說明,在解決復(fù)制問題時,面向?qū)ο笥懈蟮膬?yōu)越性。
面向過程是蛋炒飯,面向?qū)ο笫巧w澆飯。蓋澆飯的好處就是“菜”“飯”分離,從而提高了制作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟件工程的專業(yè)術(shù)語就是“可維護性”比較好,“飯” 和“菜”的耦合度比較低。
區(qū)別
編程思路不同: 面向過程以實現(xiàn)功能的函數(shù)開發(fā)為主,而面向?qū)ο笠紫瘸橄蟪鲱悺傩约捌浞椒?,然后通過實例化類、執(zhí)行方法來完成功能。
封裝性:都具有封裝性,但是面向過程是封裝的是功能,而面向?qū)ο蠓庋b的是數(shù)據(jù)和功能。
面向?qū)ο缶哂欣^承性和多態(tài)性,而面向過程沒有繼承性和多態(tài)性,所以面向?qū)ο髢?yōu)勢是明顯。
方法重載和方法重寫(覆蓋)的區(qū)別
英文位置不同作用不同重載overload同一個類中在一個類里面為一種行為提供多種實現(xiàn)方式并提高可讀性重寫override子類和父類間父類方法無法滿足子類的要求,子類通過方法重寫滿足要求修飾符返回值方法名參數(shù)拋出異常重載無關(guān)無關(guān)相同不同無關(guān)重寫大于等于小于等于相同相同小于等于
23.this和super關(guān)鍵字的作用
this是對象內(nèi)部指代自身的引用,同時也是解決成員變量和局部變量同名問題;this可以調(diào)用成員變量,不能調(diào)用局部變量;this也可以調(diào)用成員方法,但是在普通方法中可以省略this,在構(gòu)造方法中不允許省略,必須是構(gòu)造方法的第一條語句。,而且在靜態(tài)方法當(dāng)中不允許出現(xiàn)this關(guān)鍵字。
super代表對當(dāng)前對象的直接父類對象的引用,super可以調(diào)用直接父類的成員變量(注意權(quán)限修飾符的影響,比如不能訪問private成員)
super可以調(diào)用直接父類的成員方法(注意權(quán)限修飾符的影響,比如不能訪問private成員);super可以調(diào)用直接父類的構(gòu)造方法,只限構(gòu)造方法中使用,且必須是第一條語句。
24.static關(guān)鍵字的作用
static可以修飾變量、方法、代碼塊和內(nèi)部類
static屬性屬于這個類所有,即由該類創(chuàng)建的所有對象共享同一個static屬性??梢詫ο髣?chuàng)建后通過對象名.屬性名和類名.屬性名兩種方式來訪問。也可以在沒有創(chuàng)建任何對象之前通過類名.屬性名的方式來訪問。
static變量和非static變量的區(qū)別(都是成員變量,不是局部變量)
1.在內(nèi)存中份數(shù)不同
不管有多少個對象,static變量只有1份。對于每個對象,實例變量都會有單獨的一份
static變量是屬于整個類的,也稱為類變量。而非靜態(tài)變量是屬于對象的,也稱為實例變量
2.在內(nèi)存中存放的位置不同
3.訪問的方式不同
實例變量: 對象名.變量名 stu1.name="小明明";
靜態(tài)變量:對象名.變量名 stu1.schoolName="西二旗小學(xué)"; 不推薦如此使用
類名.變量名 Student.schoolName="東三旗小學(xué)"; 推薦使用
4.在內(nèi)存中分配空間的時間不同
Student.schoolName="東三旗小學(xué)";或者Student stu1 = new Student("小明","男",20,98);
static方法也可以通過對象名.方法名和類名.方法名兩種方式來訪問
static代碼塊。當(dāng)類被第一次使用時(可能是調(diào)用static屬性和方法,或者創(chuàng)建其對象)執(zhí)行靜態(tài)代碼塊,且只被執(zhí)行一次,主要作用是實現(xiàn)static屬性的初始化。
static內(nèi)部類:屬于整個外部類,而不是屬于外部類的每個對象。不能訪問外部類的非靜態(tài)成員(變量或者方法),.可以訪問外部類的靜態(tài)成員
25.final和abstract關(guān)鍵字的作用
final和abstract是功能相反的兩個關(guān)鍵字,可以對比記憶
abstract可以用來修飾類和方法,不能用來修飾屬性和構(gòu)造方法;使用abstract修飾的類是抽象類,需要被繼承,使用abstract修飾的方法是抽象方法,需要子類被重寫。
final可以用來修飾類、方法和屬性,不能修飾構(gòu)造方法。使用final修飾的類不能被繼承,使用final修飾的方法不能被重寫,使用final修飾的變量的值不能被修改,所以就成了常量。
特別注意:final修飾基本類型變量,其值不能改變,由原來的變量變?yōu)槌A?;但是final修飾引用類型變量,棧內(nèi)存中的引用不能改變,但是所指向的堆內(nèi)存中的對象的屬性值仍舊可以改變。例如

26.final、finally、finalize的區(qū)別
final修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承例如:String類、Math類等。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重寫,但是能夠重載。 使用final修飾的對象,對象的引用地址不能變,但是對象的值可以變!
finally在異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果有finally的話,則不管是否發(fā)生異常,finally語句都會被執(zhí)行。一般情況下,都把關(guān)閉物理連接(IO流、數(shù)據(jù)庫連接、Socket連接)等相關(guān)操作,放入到此代碼塊中。
finalize方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要清理工作。finalize() 方法是在垃圾收集器刪除對象之前被調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。 一般情況下,此方法由JVM調(diào)用,程序員不要去調(diào)用!
27.寫出java.lang.Object類的六個常用方法
(1)public boolean equals(java.lang.Object)
比較對象的地址值是否相等,如果子類重寫,則比較對象的內(nèi)容是否相等;
(2)public native int hashCode() 獲取哈希碼
(3)public java.lang.String toString() 把數(shù)據(jù)轉(zhuǎn)變成字符串
(4)public final native java.lang.Class getClass() 獲取類結(jié)構(gòu)信息
(5)protected void finalize() throws java.lang.Throwable
垃圾回收前執(zhí)行的方法
(6)protected native Object clone() throws
java.lang.CloneNotSupportedException 克隆
(7)public final void wait() throws java.lang.InterruptedException
多線程中等待功能
(8)public final native void notify() 多線程中喚醒功能
(9)public final native void notifyAll() 多線程中喚醒所有等待線程的功能
28.private/默認(rèn)/protected/public權(quán)限修飾符的區(qū)別
同一個類同一個包子類所有類private*defailt**protected***public****
類的訪問權(quán)限只有兩種
public公共的 可被同一項目中所有的類訪問。 (必須與文件名同名)
default默認(rèn)的 可被同一個包中的類訪問。
成員(成員變量或成員方法)訪問權(quán)限共有四種:
public?公共的 可以被項目中所有的類訪問。(項目可見性)
protected?受保護的 可以被這個類本身訪問;同一個包中的所有其他的類訪問;被它的子類(同一個包以及不同包中的子類)訪問。(子類可見性)
default?默認(rèn)的被這個類本身訪問;被同一個包中的類訪問。(包可見性)
private?私有的 只能被這個類本身訪問。(類可見性)
29.繼承條件下構(gòu)造方法的執(zhí)行過程
繼承條件下構(gòu)造方法的調(diào)用規(guī)則如下:
情況1:如果子類的構(gòu)造方法中沒有通過super顯式調(diào)用父類的有參構(gòu)造方法,也沒有通過this顯式調(diào)用自身的其他構(gòu)造方法,則系統(tǒng)會默認(rèn)先調(diào)用父類的無參構(gòu)造方法。在這種情況下,寫不寫“super();”語句,效果是一樣的。
情況2:如果子類的構(gòu)造方法中通過super顯式調(diào)用父類的有參構(gòu)造方法,那將執(zhí)行父類相應(yīng)構(gòu)造方法,而不執(zhí)行父類無參構(gòu)造方法。
情況3:如果子類的構(gòu)造方法中通過this顯式調(diào)用自身的其他構(gòu)造方法,在相應(yīng)構(gòu)造方法中應(yīng)用以上兩條規(guī)則。
特別注意的是,如果存在多級繼承關(guān)系,在創(chuàng)建一個子類對象時,以上規(guī)則會多次向更高一級父類應(yīng)用,一直到執(zhí)行頂級父類Object類的無參構(gòu)造方法為止。
30.==和equals的區(qū)別和聯(lián)系
“==”是關(guān)系運算符,equals()是方法,同時他們的結(jié)果都返回布爾值;
“==”使用情況如下:
a) 基本類型,比較的是值
b) 引用類型,比較的是地址
c) 不能比較沒有父子關(guān)系的兩個對象
equals()方法使用如下:
a) 系統(tǒng)類一般已經(jīng)覆蓋了equals(),比較的是內(nèi)容。
b) 用戶自定義類如果沒有覆蓋equals(),將調(diào)用父類的equals (比如是Object),而Object的equals的比較是地址(return (this == obj);)
c) 用戶自定義類需要覆蓋父類的equals()
注意:Object的==和equals比較的都是地址,作用相同
31.談?wù)凧ava的多態(tài)
實現(xiàn)多態(tài)的三個條件(前提條件,向上轉(zhuǎn)型、向下轉(zhuǎn)型)
1、繼承的存在;(繼承是多態(tài)的基礎(chǔ),沒有繼承就沒有多態(tài))
2、子類重寫父類的方法。(多態(tài)下會調(diào)用子類重寫后的方法)
3、父類引用變量指向子類對象。(涉及子類到父類的類型轉(zhuǎn)換)
向上轉(zhuǎn)型 Student person = new Student()
將一個父類的引用指向一個子類對象,成為向上轉(zhuǎn)型,自動進行類型轉(zhuǎn)換。此時通過父類引用變量調(diào)用的方法是子類覆蓋或繼承父類的方法,而不是父類的方法此時通過父類引用變量無法調(diào)用子類特有的方法。
向下轉(zhuǎn)型 Student stu = (Student)person;
將一個指向子類對象的引用賦給一個子類的引用,成為向下轉(zhuǎn)型,此時必須進行強制類型轉(zhuǎn)換。向下轉(zhuǎn)型必須轉(zhuǎn)換為父類引用指向的真實子類類型,,否則將出現(xiàn)ClassCastException,不是任意的強制轉(zhuǎn)換
向下轉(zhuǎn)型時可以結(jié)合使用instanceof運算符進行強制類型轉(zhuǎn)換,比如出現(xiàn)轉(zhuǎn)換異常---ClassCastException
32.簡述Java的垃圾回收機制
傳統(tǒng)的C/C++語言,需要程序員負責(zé)回收已經(jīng)分配內(nèi)存。
顯式回收垃圾回收的缺點:
1)程序忘記及時回收,從而導(dǎo)致內(nèi)存泄露,降低系統(tǒng)性能。
2)程序錯誤回收程序核心類庫的內(nèi)存,導(dǎo)致系統(tǒng)崩潰。
Java語言不需要程序員直接控制內(nèi)存回收,是由JRE在后臺自動回收不再使用的內(nèi)存,稱為垃圾回收機制,簡稱GC;
1)可以提高編程效率。
2)保護程序的完整性。
3)其開銷影響性能。Java虛擬機必須跟蹤程序中有用的對象,確定哪些是無用的。
垃圾回收機制的?特點
1)垃圾回收機制回收J(rèn)VM堆內(nèi)存里的對象空間,不負責(zé)回收棧內(nèi)存數(shù)據(jù)。
2)對其他物理連接,比如數(shù)據(jù)庫連接、輸入流輸出流、Socket連接無能為力。
3)垃圾回收發(fā)生具有不可預(yù)知性,程序無法精確控制垃圾回收機制執(zhí)行。
4)可以將對象的引用變量設(shè)置為null,暗示垃圾回收機制可以回收該對象。
現(xiàn)在的JVM有多種垃圾回收?實現(xiàn)算法,表現(xiàn)各異。
垃圾回收機制回收任何對象之前,總會先調(diào)用它的finalize方法(如果覆蓋該方法,讓一個新的引用變量重新引用該對象,則會重新激活對象)。
程序員可以通過System.gc()或者Runtime.getRuntime().gc()來通知系統(tǒng)進行垃圾回收,會有一些效果,但是系統(tǒng)是否進行垃圾回收依然不確定。
永遠不要主動調(diào)用某個對象的finalize方法,應(yīng)該交給垃圾回收機制調(diào)用。
33.基本數(shù)據(jù)類型和包裝類
1) 八個基本數(shù)據(jù)類型的包裝類

2)為什么為基本類型引入包裝類
2.1基本數(shù)據(jù)類型有方便之處,簡單、高效。
2.2但是Java中的基本數(shù)據(jù)類型卻是不面向?qū)ο蟮模]有屬性、方法),這在實際使用時存在很多的不便(比如集合的元素只能是Object)。
為了解決這個不足,在設(shè)計類時為每個基本數(shù)據(jù)類型設(shè)計了一個對應(yīng)的類進行包裝,這樣八個和基本數(shù)據(jù)類型對應(yīng)的類統(tǒng)稱為包裝類(Wrapper Class)。
3) 包裝類和基本數(shù)據(jù)類型之間的轉(zhuǎn)換
3.1包裝類------ wrapperInstance.xxxValue() ------>基本數(shù)據(jù)類型
3.2包裝類-------new WrapperClass(primitive)
3.2包裝類-------new WrapperClass(primitive)
4) 自動裝箱和自動拆箱
JDK1.5提供了自動裝箱(autoboxing)和自動拆箱(autounboxing)功能, 從而實現(xiàn)了包裝類和基本數(shù)據(jù)類型之間的自動轉(zhuǎn)換
5) 包裝類還可以實現(xiàn)基本類型變量和字符串之間的轉(zhuǎn)換
基本類型變量--->String.valueof()--->字符串 基本類型變量<---WrapperClass.parseXxx(string)---字符串
34.Integer與int的區(qū)別
int是java提供的8種原始數(shù)據(jù)類型之一,Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。
int是java提供的8種原始數(shù)據(jù)類型之一,Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。
在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個對象是否是臨時的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。
另外,Integer提供了多個與整數(shù)相關(guān)的操作方法,例如,將一個字符串轉(zhuǎn)換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。
35.java.sql.Date和java.util.Date的聯(lián)系和區(qū)別
1) java.sql.Date是java.util.Date的子類,是一個包裝了毫秒值的瘦包裝器,允許 JDBC 將毫秒值標(biāo)識為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以來經(jīng)過的毫秒數(shù)。 為了與 SQL DATE 的定義一致,由 java.sql.Date 實例包裝的毫秒值必須通過將時間、分鐘、秒和毫秒設(shè)置為與該實例相關(guān)的特定時區(qū)中的零來“規(guī)范化”。 說白了,java.sql.Date就是與數(shù)據(jù)庫Date相對應(yīng)的一個類型,而java.util.Date是純java的Date。
2)JAVA里提供的日期和時間類,java.sql.Date和java.sql.Time,只會從數(shù)據(jù)庫里讀取某部分值,這有時會導(dǎo)致丟失數(shù)據(jù)。例如一個包含2002/05/22 5:00:57 PM的字段,讀取日期時得到的是2002/05/22,而讀取時間時得到的是5:00:57 PM. 你需要了解數(shù)據(jù)庫里存儲時間的精度。有些數(shù)據(jù)庫,比如MySQL,精度為毫秒,然而另一些數(shù)據(jù)庫,包括Oracle,存儲SQL DATE類型數(shù)據(jù)時,毫秒部分的數(shù)據(jù)是不保存的。以下操作中容易出現(xiàn)不易被發(fā)現(xiàn)的BUG:獲得一個JAVA里的日期對象。 從數(shù)據(jù)庫里讀取日期 試圖比較兩個日期對象是否相等。如果毫秒部分丟失,本來認(rèn)為相等的兩個日期對象用Equals方法可能返回false。.sql.Timestamp類比java.util.Date類精確度要高。這個類包了一個getTime()方法,但是它不會返回額外精度部分的數(shù)據(jù),因此必須使用...
總之,java.util.Date 就是Java的日期對象,而java.sql.Date 是針對SQL語句使用的,只包含日期而沒有時間部分。
36.使用遞歸算法輸出某個目錄下所有文件和子目錄列表

37.關(guān)于Java編譯,下面哪一個正確()(選擇一項)
AJava程序經(jīng)編譯后產(chǎn)生machine code
B.Java程序經(jīng)編譯后會生產(chǎn)byte code
C.Java程序經(jīng)編譯后會產(chǎn)生DLL
D.以上都不正確
答案:B
分析: Java是解釋型語言,編譯出來的是字節(jié)碼; 因此A不正確,C是C/C++語言編譯動態(tài)鏈接庫的文件為.DLL; 正確答案為B
38.下列說法正確的有()(選擇一項)
Aclass中的construtor不可省略
B.construtor與class同名,但方法不能與class同名
C.construtor在一個對象被new時執(zhí)行
D.一個class只能定義一個construtor
答案:C
分析:A:如果class中的construtor省略不寫,系統(tǒng)會默認(rèn)提供一個無參構(gòu)造
B:方法名可以與類名同名,只是不符合命名規(guī)范
D:一個class中可以定義N多個construtor,這些construtor構(gòu)成構(gòu)造方法的重載
39.Java中接口的修飾符可以為()(選擇一項)
Aprivate
B.protected
C.final
D.abstract
答案:D
分析:接口中的訪問權(quán)限修飾符只可以是public或default
接口中的所有的方法必須要實現(xiàn)類實現(xiàn),所以不能使用final
接口中所有的方法默認(rèn)都是abstract的,所以接口可以使用abstract修飾,但通常abstract可以省略不寫
40.給定以下代碼,程序?qū)⑤敵?()(選擇一項)

A不能通過編譯
B.通過編譯,輸出AB
C.通過編譯,輸出B
D.通過編譯,輸出A
答案:B
分析:在繼承關(guān)系下,創(chuàng)建子類對象,先執(zhí)行父類的構(gòu)造方法,再執(zhí)行子類的構(gòu)造方法。
41.下列關(guān)于關(guān)鍵字的使用說法錯誤的是()(選擇一項)
A.abstract不能與final并列修飾同一個類
B.abstract類中可以有private的成員
C.abstract方法必須在abstract類中
D.static方法能處理非static的屬性
答案:D
分析:因為static得方法在裝載class得時候首先完成,比 構(gòu)造方法早,此時非static得屬性和方法還沒有完成初始化所以不能調(diào)用。
42.下列哪些語句關(guān)于內(nèi)存回收的說法是正確的()(選擇一項)
A.程序員必須創(chuàng)建一個線程來釋放內(nèi)存
B.內(nèi)存回收程序負責(zé)釋放無用內(nèi)存
C.內(nèi)存回收程序允許程序員直接釋放內(nèi)存
D.內(nèi)存回收程序可以在指定的時間釋放內(nèi)存對象
答案:B
分析: A. 程序員不需要創(chuàng)建線程來釋放內(nèi)存.
C. 也不允許程序員直接釋放內(nèi)存.
D. 不一定在什么時刻執(zhí)行垃圾回收.
43.選出合理的標(biāo)識符()(選擇兩項)
A_sysl_111
B.2 mail
C.$change
D.class
答案:AC
分析: 標(biāo)識符的命令規(guī)范,可以包含字母、數(shù)字、下劃線、$,不能以數(shù)字開頭,不能是Java關(guān)鍵字
44.下列說法正確的是()(選擇多項)
A.java.lang.Cloneable是類
B.java.langRunnable是接口
C.Double對象在java.lang包中
D.Double a=1.0是正確的java語句
分析:java.lang.Cloneable是接口
45.定義一個類名為”MyClass.java”的類,并且該類可被一個工程中的所有類訪問,那么該類的正確聲明為()(選擇兩項)
A.class MyClass extends Object
B.public class MyClass
C.public class MyClass extends Object
答案:BC
46.面向?qū)ο蟮奶卣饔心男┓矫??請用生活中的例子來描述?/strong>
答: 面向?qū)ο蟮娜筇卣鳎悍庋b、繼承、多態(tài)。
舉例:(比如設(shè)計一個游戲)我現(xiàn)在創(chuàng)建了一個對象,名叫戰(zhàn)士。
戰(zhàn)士的屬性是—性別,年齡,職業(yè),等級,戰(zhàn)斗力,血量。
它的方法—戰(zhàn)斗,逃跑,吃飯,睡覺,死。
后來,我又建了一個對象,叫人。
屬性:性別,年齡,職業(yè),等級,血量
方法:逃跑,吃飯,睡覺,死。
我讓人,成為戰(zhàn)士的父類,戰(zhàn)士可以直接繼承人的屬性和方法。
戰(zhàn)士修改成—
屬性:戰(zhàn)斗力。
方法:戰(zhàn)斗。
看上去戰(zhàn)士的資料變少了,實際上沒有,我們?nèi)匀豢梢哉{(diào)用方法—戰(zhàn)士.死。
而且我們還可以重載戰(zhàn)士.死的方法,簡稱重載死法。
我還建了一個對象—法師,父類也是人。
屬性:法力值
方法:施法,泡妞。
你看,用了繼承,創(chuàng)建對象變得更方便了。
再后來,我又建立了一個對象,叫怪物。
屬性:等級,戰(zhàn)力,血量。
方法:戰(zhàn)斗,死。
建了個對象,叫白兔怪,父類怪物,可繼承怪物所有的屬性和方法。
屬性:毛色。
方法:賣萌,吃胡蘿卜。
47.說明內(nèi)存泄漏和內(nèi)存溢出的區(qū)別和聯(lián)系,結(jié)合項目經(jīng)驗描述Java程序中如何檢測?如何解決?
答:內(nèi)存溢出 out of memory,是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。
內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光。
memory leak會最終會導(dǎo)致out of memory!
48.什么是Java的序列化,如何實現(xiàn)Java的序列化?列舉在哪些程序中見過Java序列化?
答:Java中的序列化機制能夠?qū)⒁粋€實例對象(只序列化對象的屬性值,而不會去序列化什么所謂的方法。)的狀態(tài)信息寫入到一個字節(jié)流中使其可以通過socket進行傳輸、或者持久化到存儲數(shù)據(jù)庫或文件系統(tǒng)中;然后在需要的時候通過字節(jié)流中的信息來重構(gòu)一個相同的對象。一般而言,要使得一個類可以序列化,只需簡單實現(xiàn)java.io.Serializable接口即可。
對象的序列化主要有兩種用途:
1) 把對象的字節(jié)序列永久地保存到硬盤上,通常存放在一個文件中;
2) 在網(wǎng)絡(luò)上傳送對象的字節(jié)序列。
在很多應(yīng)用中,需要對某些對象進行序列化,讓它們離開內(nèi)存空間,入住物理硬盤,以便長期保存。比如最常見的是Web服務(wù)器中的Session對象,當(dāng)有 10萬用戶并發(fā)訪問,就有可能出現(xiàn)10萬個Session對象,內(nèi)存可能吃不消,于是Web容器就會把一些seesion先序列化到硬盤中,等要用了,再把保存在硬盤中的對象還原到內(nèi)存中。
當(dāng)兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個Java對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對象。
49.不通過構(gòu)造函數(shù)也能創(chuàng)建對象嗎?
答:Java創(chuàng)建對象的幾種方式(重要):
1、 用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
2、 運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
3、 調(diào)用對象的clone()方法。
4、運用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。
(1)和(2)都會明確的顯式的調(diào)用構(gòu)造函數(shù) ;(3)是在內(nèi)存上對已有對象的影印,所以不會調(diào)用構(gòu)造函數(shù) ;(4)是從文件中還原類的對象,也不會調(diào)用構(gòu)造函數(shù)。
50.匿名內(nèi)部類可不可以繼承或?qū)崿F(xiàn)接口。為什么?
答:匿名內(nèi)部類是沒有名字的內(nèi)部類,不能繼承其它類,但一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部類實現(xiàn).
1、由于匿名內(nèi)部類沒有名字,所以它沒有構(gòu)造函數(shù)。因為沒有構(gòu)造函數(shù),所以它必須完全借用父類的構(gòu)造函數(shù)來實例化,換言之:匿名內(nèi)部類完全把創(chuàng)建對象的任務(wù)交給了父類去完成。
2、在匿名內(nèi)部類里創(chuàng)建新的方法沒有太大意義,但它可以通過覆蓋父類的方法達到神奇效果,如上例所示。這是多態(tài)性的體現(xiàn)。
3、因為匿名內(nèi)部類沒有名字,所以無法進行向下的強制類型轉(zhuǎn)換,持有對一個匿名內(nèi)部類對象引用的變量類型一定是它的直接或間接父類類型。
51.在Java中,為什么基本類型不能做為HashMap的鍵值,而只能是引用類型,把引用類型做為HashMap的健值,需要注意哪些地方。
在Java中是使用泛型來約束HashMap中的key和value的類型的,即HashMap< K, V>;而泛型在Java的規(guī)定中必須是對象Object類型的,也就是說HashMap< K, V>可以理解為HashMap< Object, Object>,很顯然基本數(shù)據(jù)類型不是Object類型的,因此不能作為鍵值,只能是引用類型。雖然我們在HashMap中可以這樣添加數(shù)據(jù):“map.put(1, “Java”);”,但實際上是將其中的key值1進行了自動裝箱操作,變?yōu)榱薎nteger類型。
52.簡述Java中如何實現(xiàn)多態(tài)
實現(xiàn)多態(tài)有三個前提條件:
1、 繼承的存在;(繼承是多態(tài)的基礎(chǔ),沒有繼承就沒有多態(tài))。
2、子類重寫父類的方法。(多態(tài)下會調(diào)用子類重寫后的方法)。
3、父類引用變量指向子類對象。(涉及子類到父類的類型轉(zhuǎn)換)。
最后使用父類的引用變量調(diào)用子類重寫的方法即可實現(xiàn)多態(tài)。
53.以下對繼承的描述錨誤的是 (? )
AJava中的繼承允許一個子類繼承多個父類
B.父類更具有通用性,子類更具體
C.Java中的繼承存在著傳遞性
D.當(dāng)實例化子類時會遞歸調(diào)用父類中的構(gòu)造方法
答案:A
分析:Java是單繼承的,一個類只能繼承一個父類。
54.Java 中 Math.random()/Math.random()值為?
如果除數(shù)與被除數(shù)均為0.0的話,則運行結(jié)果為NaN(Not a Number的簡寫),計算錯誤。
55.Java中,如果Manager是Employee的子類,那么Pair是Pair的子類嗎?
不是,兩者沒有任何關(guān)聯(lián);
Pair是單獨的類,只不過用不同類型的參數(shù)(泛型)進行了相應(yīng)的實例化而已;所以,Pair< Manager>和Pair< Employee>不是子類的關(guān)系。
56.接口和抽象類的區(qū)別
抽象類和接口均包含抽象方法,類必須實現(xiàn)所有的抽象方法,否則是抽象類
抽象類和接口都不能實例化,他們位于繼承樹的頂端,用來被其他類繼承和實現(xiàn)
兩者的區(qū)別主要體現(xiàn)在兩方面:語法方面和設(shè)計理念方面
語法方面的區(qū)別是比較低層次的,非本質(zhì)的,主要表現(xiàn)在:
接口中只能定義全局靜態(tài)常量,不能定義變量。抽象類中可以定義常量和變量。
接口中所有的方法都是全局抽象方法。抽象類中可以有0個、1個或多個,甚至全部都是抽象方法。
抽象類中可以有構(gòu)造方法,但不能用來實例化,而在子類實例化是執(zhí)行,完成屬于抽象類的初始化操作。接口中不能定義構(gòu)造方法。
一個類只能有一個直接父類(可以是抽象類),但可以充實實現(xiàn)多個接口。一個類使用extends來繼承抽象類,使用implements來實現(xiàn)接口。
抽象類體現(xiàn)了一種繼承關(guān)系,目的是復(fù)用代碼,抽象類中定義了各個子類的相同代碼,可以認(rèn)為父類是一個實現(xiàn)了部分功能的“中間產(chǎn)品”,而子類是“最終產(chǎn)品”。父類和子類之間必須存在“is-a”的關(guān)系,即父類和子類在概念本質(zhì)上應(yīng)該是相同的。
接口并不要求實現(xiàn)類和接口在概念本質(zhì)上一致的,僅僅是實現(xiàn)了接口定義的約定或者能力而已。接口定義了“做什么”,而實現(xiàn)類負責(zé)完成“怎么做”,體現(xiàn)了功能(規(guī)范)和實現(xiàn)分離的原則。接口和實現(xiàn)之間可以認(rèn)為是一種“has-a的關(guān)系”
57.同步代碼塊和同步方法有什么區(qū)別
相同點:
同步方法就是在方法前加關(guān)鍵字synchronized,然后被同步的方法一次只能有一個線程進入,其他線程等待。而同步代碼塊則是在方法內(nèi)部使用大括號使得一個代碼塊得到同步。同步代碼塊會有一個同步的“目標(biāo)”,使得同步塊更加靈活一些(同步代碼塊可以通過“目標(biāo)”決定需要鎖定的對象)。
一般情況下,如果此“目標(biāo)”為this,同步方法和代碼塊沒有太大的區(qū)別。
區(qū)別:
同步方法直接在方法上加synchronized實現(xiàn)加鎖,同步代碼塊則在方法內(nèi)部加鎖。很明顯,同步方法鎖的范圍比較大,而同步代碼塊范圍要小點。一般同步的范圍越大,性能就越差。所以一般需要加鎖進行同步的時候,范圍越小越好,這樣性能更好。
58.靜態(tài)內(nèi)部類和內(nèi)部類有什么區(qū)別
靜態(tài)內(nèi)部類不需要有指向外部類的引用。但非靜態(tài)內(nèi)部類需要持有對外部類的引用。
靜態(tài)內(nèi)部類可以有靜態(tài)成員(方法,屬性),而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員(方法,屬性)。
非靜態(tài)內(nèi)部類能夠訪問外部類的靜態(tài)和非靜態(tài)成員。靜態(tài)內(nèi)部類不能訪問外部類的非靜態(tài)成員,只能訪問外部類的靜態(tài)成員。
實例化方式不同:
1) 靜態(tài)內(nèi)部類:不依賴于外部類的實例,直接實例化內(nèi)部類對象
2) 非靜態(tài)內(nèi)部類:通過外部類的對象實例生成內(nèi)部類對象
59.反射的概念與作用
反射的概念:
反射,一種計算機處理方式。是程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力。
Java反射可以于運行時加載,探知和使用編譯期間完全未知的類.
程序在運行狀態(tài)中, 可以動態(tài)加載一個只有名稱的類, 對于任意一個已經(jīng)加載的類,都能夠知道這個類的所有屬性和方法; 對于任意一個對象,都能調(diào)用他的任意一個方法和屬性;
加載完類之后, 在堆內(nèi)存中會產(chǎn)生一個Class類型的對象(一個類只有一個Class對象), 這個對象包含了完整的類的結(jié)構(gòu)信息,而且這個Class對象就像一面鏡子,透過這個鏡子看到類的結(jié)構(gòu),所以被稱之為:反射.
java反射使得我們可以在程序運行時動態(tài)加載一個類,動態(tài)獲取類的基本信息和定義的方法,構(gòu)造函數(shù),域等。
除了檢閱類信息外,還可以動態(tài)創(chuàng)建類的實例,執(zhí)行類實例的方法,獲取類實例的域值。反射使java這種靜態(tài)語言有了動態(tài)的特性。
反射的作用:
通過反射可以使程序代碼訪問裝載到JVM 中的類的內(nèi)部信息
1) 獲取已裝載類的屬性信息
2) 獲取已裝載類的方法
3) 獲取已裝載類的構(gòu)造方法信息
反射的優(yōu)點:
增加程序的靈活性。
如struts中。請求的派發(fā)控制。
當(dāng)請求來到時。struts通過查詢配置文件。找到該請求對應(yīng)的action。已經(jīng)方法。
然后通過反射實例化action。并調(diào)用響應(yīng)method。
如果不適用反射,那么你就只能寫死到代碼里了。
所以說,一個靈活,一個不靈活。
很少情況下是非用反射不可的。大多數(shù)情況下反射是為了提高程序的靈活性。因此一般框架中使用較多。因為框架要適用更多的情況。對靈活性要求較高。
60.提供Java存取數(shù)據(jù)庫能力的包是()
Ajava.sql
B.java.awt
C.java.lang
D.java.swing
答案:A
分析:
java.awt和javax.swing兩個包是圖形用戶界面編程所需要的包;
java.lang包則提供了Java編程中用到的基礎(chǔ)類。
61.下列運算符合法的是()(多選)
A&&
B.<>
C.if
D.=
答案:AD
分析:
&&是邏輯運算符中的短路與;
<>表示不等于,但是Java中不能這么使用,應(yīng)該是!=;
if不是運算符;
=是賦值運算符。
62.執(zhí)行如下程序代碼,c的值打印出來是()

A.0
B.1
C.-1
D.死循環(huán)
答案:C
分析:
do-while循環(huán)的特點是先執(zhí)行后判斷,所以代碼先執(zhí)行--c操作,得到c為-1,之后執(zhí)行a=a-1的操作,得到a為-1,然后判斷a是否大于0,判斷條件不成立,退出循環(huán),輸出c為-1。
63.下列哪一種敘述是正確的()
A.abstract修飾符可修飾字段,方法和類
B.抽象方法的body部分必須用一對大括號{}包住
C.聲明抽象方法,大括號可有可無
D.聲明抽象方法不可寫出大括號
答案:D
分析:
abstract只能修飾方法和類,不能修飾字段;
抽象方法不能有方法體,即沒有{};
同B。
64.下列語句正確的是()
A形式參數(shù)可被視為local Variable
B.形式參數(shù)可被視為local Variable
C.形式參數(shù)可被所有的字段修飾符修飾
D.形式參數(shù)為方法被調(diào)用時,真正被傳遞的參數(shù)
答案:A
分析:
local Variable為局部變量,形參和局部變量一樣都只有在方法內(nèi)才會發(fā)生作用,也只能在方法中使用,不會在方法外可見;
對于形式參數(shù)只能用final修飾符,其它任何修飾符都會引起編譯器錯誤;
真正被傳遞的參數(shù)是實參;
形式參數(shù)可是基本數(shù)據(jù)類型也可以是引用類型(對象)。
65.下列哪種說法是正確的()
A實例方法可直接調(diào)用超類的實例方法
B.實例方法可直接調(diào)用超類的類方法
C.實例方法可直接調(diào)用其他類的實例方法
D.實例方法可直接調(diào)用本類的類方法
答案:D
分析:
實例方法不可直接調(diào)用超類的私有實例方法;
要看訪問權(quán)限。
66.Java程序的種類有()(多選)
A類 (Class)
B.Applet
C.Application
D.Servlet
答案:BCD
分析:
是Java中的類,不是程序;
內(nèi)嵌于Web文件中,由瀏覽器來觀看的Applet;
可獨立運行的 Application;
服務(wù)器端的 Servlet。
?由于字?jǐn)?shù)限制,后續(xù)內(nèi)容更加精彩,歡迎關(guān)注,整理不易,可否動動你的小手給小編來點更新的動力,希望對你們會有幫助!~