考核點(diǎn):Java編譯過程。
答:
第一步:編寫源程序,源程序擴(kuò)展名為“.java”;
第二步:在Dos命令行下,進(jìn)入“.java”文件所在的目錄,使用javac命令進(jìn)行編譯源程序;
第三步:編譯后,使用Java命令運(yùn)行編譯后的“.class”字節(jié)碼文件。
考核點(diǎn):基本數(shù)據(jù)類型。
答:String不是基本數(shù)據(jù)類型,是引用數(shù)據(jù)類型。
答:基本數(shù)據(jù)類型有byte、short、int、long、float、double、char、boolean。
考核點(diǎn):包裝類、基本數(shù)據(jù)類型。
答:
int是八種基本數(shù)據(jù)類型中的一個(gè);
Integer是該基本數(shù)據(jù)類型所對應(yīng)的包裝類;
Integer可以存null值,int不可以;
Integer相比int而言其占用的內(nèi)存更大一些;
在拆箱和裝箱中,二者自動(dòng)轉(zhuǎn)換。
考核點(diǎn):自動(dòng)類型轉(zhuǎn)換。
答:
不正確,不能;
因?yàn)镴ava默認(rèn)浮點(diǎn)型數(shù)據(jù)是double類型,所以不能編譯,正確寫法為float f=3.4f;
因?yàn)閟l+1的結(jié)果為int類型,而int類型不能直接賦值給short類型。
考核點(diǎn):null與空串的區(qū)別。
答:
String s=null:s沒有初始化,不能使用,否則會(huì)引發(fā)空指針異常。
String s=””: s的初始值為””,可以正常使用。
考核點(diǎn):Switch語句,與JDK7特性。
答:
Swtich可以作用在byte、short、int、char四個(gè)類型;
Enum類型在JDK1.5以上的版本可以使用;
String類型在JDK1.7以上的版本中可以使用。
考核點(diǎn):String類常用方法(看看其他的常用方法,至少能說出5個(gè)以上)。
答:
第一種,使用String類的split方法:
String str = ”jack,rose,tom,mike,john”; String[] strs = str.split(","); |
l 第二種(可以不答),使用StringTokenizer類,代碼為:
StringTokenizer tokener = new StringTokenizer("jack,rose,tom,mike,john ", ","); String[] result = new String[tokener.countTokens()]; int i = 0; while (tokener.hasMoreTokens()) { result[i++] = tokener.nextToken(); } |
考核點(diǎn):屬性與方法的區(qū)別。
答:
數(shù)組沒有l(wèi)ength方法,但是有l(wèi)ength屬性;
String類有l(wèi)ength()方法。
考核點(diǎn):String類型的內(nèi)存原理。
答:
如果String常量池中,已經(jīng)創(chuàng)建"xyz",則不會(huì)繼續(xù)創(chuàng)建,此時(shí)只創(chuàng)建了一個(gè)對象new String("xyz"),此時(shí)為一個(gè)對象;
如果String常量池中,沒有創(chuàng)建"xyz",則會(huì)創(chuàng)建兩個(gè)對象,一個(gè)對象的值是"xyz",一個(gè)對象new String("xyz"),此時(shí)為二個(gè)對象。
考核點(diǎn):String類型的內(nèi)存原理。
答:
0或1個(gè),如果字符串常量池有"abc",創(chuàng)建0個(gè),如果沒有就創(chuàng)建1個(gè)。
考核點(diǎn):基本類型的占用范圍。
答:
char型變量中能存儲一個(gè)中文漢字。原因如下:
在Java中,char類型采用的是Unicode編碼,每個(gè)Unicode編碼是16位,每個(gè)字節(jié)占8位,所以char占兩個(gè)字節(jié),而漢字占用兩個(gè)字節(jié);
Unicode編碼字符集中包含了漢字;
如果某個(gè)漢字沒有包含在Unicode字符集中,那么是不能被char型變量存儲的。
考核點(diǎn):break特殊用法。
答:
public void test { A:for (int j = 0; j < 10; j++) { for (int i = 1; i < 10; i++) { if (i == 5) break A; } } } |
考核點(diǎn):短路機(jī)制、按位比較。
答:
&&前的判斷條件為false,就不進(jìn)行判斷&&之后的語句,結(jié)果直接為false;
&如果比較的是兩個(gè)二進(jìn)制的值,按照按位比較。
||前的判斷條件為true,就不進(jìn)行判斷||之后的語句,結(jié)果直接為true;
|如果比較的是兩個(gè)二進(jìn)制的值,按照按位比較。
考核點(diǎn):數(shù)學(xué)類常用方法。
答:
Math.round(11.5) = 12;
Math.round(-11.5) = -11;
Math.round()方法:四舍五入。
考核點(diǎn):final關(guān)鍵字。
答:
被final修飾的類不可以被繼承;
被final修飾的方法不可以被重寫;
被final修飾的變量不可以被改變;
如果修飾引用,那么表示引用不可變,引用指向的內(nèi)容可變;
被final修飾的方法,JVM會(huì)嘗試將其內(nèi)聯(lián),以提高運(yùn)行效率;
被final修飾的常量,在編譯階段會(huì)存入常量池中。
考核點(diǎn):內(nèi)存原理。
答:
內(nèi)存泄漏(Memory Leak):是指應(yīng)用程序在申請內(nèi)存后,無法釋放已經(jīng)申請的內(nèi)存空間,一次內(nèi)存泄漏危害可以忽略,但如果任其發(fā)展最終會(huì)導(dǎo)致內(nèi)存溢出,如讀取文件后流要進(jìn)行及時(shí)的關(guān)閉以及對數(shù)據(jù)庫連接的釋放。
內(nèi)存溢出(Out Of Memory):是指應(yīng)用程序在申請內(nèi)存時(shí),沒有足夠的內(nèi)存空間供其使用。如我們在項(xiàng)目中對于大批量數(shù)據(jù)的導(dǎo)入,容易產(chǎn)生內(nèi)存溢出,一般采用分批量提交的方式。
考核點(diǎn):基本數(shù)據(jù)類型占用空間大小。
答:
布爾型boolean:8位;
字節(jié)型byte:8位;
字符型char:16位;
短整型short:16位;
整形int:32位;
長整形long:64位;
浮點(diǎn)型float:32位;
雙精度double:64位;
引申,boolean類型分析:
占用1個(gè)bit
理由是boolean類型的值只有true和false兩種邏輯值,在編譯后會(huì)使用1和0來表示,這兩個(gè)數(shù)在內(nèi)存中只需要1位(bit)即可存儲,位是計(jì)算機(jī)最小的存儲單位。
占用1個(gè)字節(jié)
理由是雖然編譯后1和0只需占用1位空間,但計(jì)算機(jī)處理數(shù)據(jù)的最小單位是1個(gè)字節(jié),1個(gè)字節(jié)等于8位,實(shí)際存儲的空間是:用1個(gè)字節(jié)的最低位存儲,其他7位用0填補(bǔ)如果值是true的話則存儲的二進(jìn)制為:0000 0001,如果是false的話則存儲的二進(jìn)制為:0000 0000。
占用4個(gè)字節(jié)
理由來源是《Java虛擬機(jī)規(guī)范》一書中的描述:“boolean數(shù)據(jù)類型,單獨(dú)使用是4個(gè)字節(jié),在數(shù)組中又是1個(gè)字節(jié)。
總結(jié):
boolean類型沒有給出精確的定義,《Java虛擬機(jī)規(guī)范》給出了4個(gè)字節(jié),和boolean數(shù)組1個(gè)字節(jié)的定義。
考核點(diǎn):數(shù)組的內(nèi)存原理
答:
如果一個(gè)對象使用new關(guān)鍵字創(chuàng)建,會(huì)在堆上分配內(nèi)存空間,然后返回該對象的引用;
因?yàn)閿?shù)組也是一個(gè)對象,所以也會(huì)在堆上分配內(nèi)存空間,然后返回該對象的引用,簡單的值類型的數(shù)組,每個(gè)數(shù)組成員是一個(gè)引用到運(yùn)行時(shí)常量池上的空間。
考核點(diǎn):編譯機(jī)制。
答:
一個(gè)Java源文件中可以包括多個(gè)類,但是單個(gè)文件中只能有一個(gè)public類,并且該public類必須與文件名相同。
考核點(diǎn):String類。
答:
String類不是基本類型,而是一個(gè)引用類型。
String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。
實(shí)際編碼中為了提高效率、節(jié)省空間,應(yīng)該用StringBuffer類、StringBuilder類來更改字符串的值。
考核點(diǎn):值傳遞和引用傳遞。
答:
基本數(shù)據(jù)傳遞參數(shù)時(shí)采用值傳遞。值傳遞意味著傳遞了值一個(gè)副本,因此,就算是改變了值副本,也不會(huì)影響源值;
引用類型傳遞參數(shù)時(shí)采用引用傳遞。引用傳遞意味著傳遞的并不是實(shí)際的對象,而是對象的引用,因此,外部對引用對象所做的改變會(huì)反映到傳遞的對象上。
考核點(diǎn):JDK的組成。
答:
Java運(yùn)行時(shí)環(huán)境(JRE)是執(zhí)行Java程序的Java虛擬機(jī),它同時(shí)也包含了執(zhí)行Applet需要的瀏覽器插件。
Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包,包含了Java開發(fā)工具(比如:JavaDoc、Javac)、JRE、Java編譯器、Java SE API,可以讓開發(fā)者開發(fā)、編譯、執(zhí)行Java應(yīng)用程序。
考核點(diǎn):Java內(nèi)存原理。
答:
在JDK1.7之前運(yùn)行時(shí)常量池邏輯包含字符串常量池,并存放在方法區(qū), 此時(shí)hotspot虛擬機(jī)對方法區(qū)的實(shí)現(xiàn)為永久代;
在JDK1.7字符串常量池被從方法區(qū)拿到了堆中,這里沒有提到運(yùn)行時(shí)常量池,也就是說字符串常量池被單獨(dú)拿到堆,運(yùn)行時(shí)常量池剩下的東西還在方法區(qū),也就是hotspot中的永久代;
在JDK1.8 hotspot移除了永久代用元空間(Meta Space)取而代之,這時(shí)候字符串常量池還在堆,運(yùn)行時(shí)常量池還在方法區(qū),只不過方法區(qū)的實(shí)現(xiàn)從永久代變成了元空間(Meta Space)。
擴(kuò)展:
Sun的JDK版本從1.3.1開始運(yùn)用Hotspot虛擬機(jī),2006年底開源,主要使用C++實(shí)現(xiàn),JNI接口部分用C實(shí)現(xiàn)。
Hotspot是較新的Java虛擬機(jī),用來代替JIT(Just in Time),可以大大提高Java運(yùn)行的性能。Java原先是把源代碼編譯為字節(jié)碼在虛擬機(jī)執(zhí)行,這樣執(zhí)行速度較慢,Hotspot將常用的部分代碼編譯為本地(native)代碼,提高了性能。