- 相關(guān)推薦
Java新手問(wèn)題集錦
Java是目前最流行的編程語(yǔ)言之一——它可以用來(lái)編寫(xiě)Windows程序或者是Web應(yīng)用,移動(dòng)應(yīng)用,網(wǎng)絡(luò)程序,消費(fèi)電子產(chǎn)品,機(jī)頂盒設(shè)備,它無(wú)處不在。以下是百分網(wǎng)小編收集整理的Java新手問(wèn)題,希望對(duì)您有所幫助!
優(yōu)先返回空集合而非
如果程序要返回一個(gè)不包含任何值的集合,確保返回的是空集合而不是。這能節(jié)省大量的'if else'檢查。
public class getLocationName {
return (==cityName ? '': cityName);
}
謹(jǐn)慎操作字符串
如果兩個(gè)字符串在for循環(huán)中使用 操作符進(jìn)行拼接,那么每次循環(huán)都會(huì)產(chǎn)生一個(gè)新的字符串對(duì)象。這不僅浪費(fèi)內(nèi)存空間同時(shí)還會(huì)影響性能。類(lèi)似的,如果初始化字符串對(duì)象,盡量不要使用構(gòu)造方法,而應(yīng)該直接初始化。比方說(shuō):
避免無(wú)用對(duì)象
創(chuàng)建對(duì)象是Java中最昂貴的操作之一。因此最好在有需要的時(shí)候再進(jìn)行對(duì)象的創(chuàng)建/初始化。如下:
數(shù)組與ArrayList之爭(zhēng)
開(kāi)發(fā)人員經(jīng)常會(huì)發(fā)現(xiàn)很難在數(shù)組和ArrayList間做選擇。它們二者互有優(yōu)劣。如何選擇應(yīng)該視情況而定。
數(shù)組是定長(zhǎng)的,而ArrayList是變長(zhǎng)的。由于數(shù)組長(zhǎng)度是固定的,因此在聲明數(shù)組時(shí)就已經(jīng)分配好內(nèi)存了。而數(shù)組的操作則會(huì)更快一些。另一方面,如果我們不知道數(shù)據(jù)的大小,那么過(guò)多的數(shù)據(jù)便會(huì)導(dǎo)致ArrayOutOfBoundException,而少了又會(huì)浪費(fèi)存儲(chǔ)空間。
ArrayList在增刪元素方面要比數(shù)組簡(jiǎn)單。
數(shù)組可以是多維的,但ArrayList只能是一維的。
try塊的finally塊沒(méi)有被執(zhí)行
看下下面這段代碼:
從代碼來(lái)看,貌似finally塊中的println語(yǔ)句應(yīng)該會(huì)被執(zhí)行5次。但當(dāng)程序運(yùn)行后,你會(huì)發(fā)現(xiàn)finally塊只執(zhí)行了4次。第5次迭代的時(shí)候會(huì)觸發(fā)exit函數(shù)的調(diào)用,于是這第5次的finally便永遠(yuǎn)也觸發(fā)不到了。原因便是——System.exit會(huì)掛起所有線程的執(zhí)行,包括當(dāng)前線程。即便是try語(yǔ)句后的finally塊,只要是執(zhí)行了exit,便也無(wú)力回天了。
在調(diào)用System.exit時(shí),JVM會(huì)在關(guān)閉前執(zhí)行兩個(gè)結(jié)束任務(wù):
首先,它會(huì)執(zhí)行完所有通過(guò)Runtime.addShutdownHook注冊(cè)進(jìn)來(lái)的終止的鉤子程序。這一點(diǎn)很關(guān)鍵,因?yàn)樗鼤?huì)釋放JVM外部的資源。
接下來(lái)的便是Finalizer了?赡苁荢ystem.runFinalizersOnExit也可能是Runtime.runFinalizersOnExit。finalizer的使用已經(jīng)被廢棄有很長(zhǎng)一段時(shí)間了。finalizer可以在存活對(duì)象上進(jìn)行調(diào)用,即便是這些對(duì)象仍在被其它線程所使用。而這會(huì)導(dǎo)致不可預(yù)期的結(jié)果甚至是死鎖。
判斷奇數(shù)
看下這幾行代碼,看看它們是否能用來(lái)準(zhǔn)確地判斷一個(gè)數(shù)是奇數(shù)?
public boolean oddOrNot(int num) {
return num % 2 == 1;
看似是對(duì)的,但是每執(zhí)行四便會(huì)有一個(gè)錯(cuò)誤的結(jié)果(用數(shù)據(jù)說(shuō)話)?紤]到負(fù)奇數(shù)的情況,它除以2的結(jié)果就不會(huì)是1。因此,返回值是false,而這樣是不對(duì)的。
代碼可以修改成這樣:
public boolean oddOrNot(int num) {
return (num & 1) != 0;
}
這么寫(xiě)不光是負(fù)奇數(shù)的問(wèn)題解決了,并且還是經(jīng)過(guò)充分優(yōu)化過(guò)的。因?yàn)樗阈g(shù)運(yùn)算和邏輯運(yùn)行要比乘除運(yùn)算更高效,計(jì)算的結(jié)果也會(huì)更快。
單引號(hào)與雙引號(hào)的區(qū)別
看起來(lái)這段代碼會(huì)返回'Haha',但實(shí)際返回的是Ha169。原因就是用了雙引號(hào)的時(shí)候,字符會(huì)被當(dāng)作字符串處理,而如果是單引號(hào)的話,字符值會(huì)通過(guò)一個(gè)叫做基礎(chǔ)類(lèi)型拓寬的操作來(lái)轉(zhuǎn)換成整型值。然后再將值相加得到169。
一些防止內(nèi)存泄露的小技巧
內(nèi)存泄露會(huì)導(dǎo)致軟件的性能降級(jí)。由于Java是自動(dòng)管理內(nèi)存的,因此開(kāi)發(fā)人員并沒(méi)有太多辦法介入。不過(guò)還是有一些方法能夠用來(lái)防止內(nèi)存泄露的。
查詢完數(shù)據(jù)后立即釋放數(shù)據(jù)庫(kù)連接
盡可能使用finally塊
釋放靜態(tài)變量中的實(shí)例
避免死鎖
死鎖出現(xiàn)的原因有很多。避免死鎖不是一句話就能解決的。通常來(lái)說(shuō),當(dāng)某個(gè)同步對(duì)象在等待另一個(gè)同步對(duì)象所擁有的資源上的鎖時(shí),便會(huì)產(chǎn)生死鎖。
試著運(yùn)行下下面的程序。它會(huì)告訴你什么是死鎖。這個(gè)死鎖是由于兩個(gè)線程都在等待對(duì)方所擁有的資源,因此會(huì)產(chǎn)生死鎖。它們會(huì)一直等待,沒(méi)有誰(shuí)會(huì)先放手。
輸出:
但如果調(diào)用的順序變一下的話,死鎖的問(wèn)題就解決了。
輸出:
替Java省點(diǎn)內(nèi)存
某些Java程序是CPU密集型的,但它們會(huì)需要大量的內(nèi)存。這類(lèi)程序通常運(yùn)行得很緩慢,因?yàn)樗鼈儗?duì)內(nèi)存的需求很大。為了能提升這類(lèi)應(yīng)用的性能,可得給它們多留點(diǎn)內(nèi)存。因此,假設(shè)我們有一臺(tái)擁有10G內(nèi)存的Tomcat服務(wù)器。在這臺(tái)機(jī)器上,我們可以用如下的這條命令來(lái)分配內(nèi)存:
export JAVA_OPTS='$JAVA_OPTS -Xms5000m -Xmx6000m -XX:PermSize=1024m -XX:MaxPermSize=2048m'
Xms = 最小內(nèi)存分配
Xmx = 最大內(nèi)存分配
XX:PermSize = JVM啟動(dòng)時(shí)的初始大小
XX:MaxPermSize = JVM啟動(dòng)后可分配的最大空間
如何計(jì)算Java中操作的耗時(shí)
在Java中進(jìn)行操作計(jì)時(shí)有兩個(gè)標(biāo)準(zhǔn)的方法
System.currentTimeMillis和System.nanoTime。問(wèn)題就在于,什么情況下該用哪個(gè)。從本質(zhì)上來(lái)講,他們的作用都是一樣的,但有以下幾點(diǎn)不同:
System.currentTimeMillis的精度在千分之一秒到千分之15秒之間(取決于系統(tǒng))而System.nanoTime則能到納秒級(jí)。
System.currentTimeMillis讀操作耗時(shí)在數(shù)個(gè)CPU時(shí)鐘左右。而System.nanoTime則需要上百個(gè)。
System.currentTimeMillis對(duì)應(yīng)的是絕對(duì)時(shí)間(1970年1 月1日所經(jīng)歷的毫秒數(shù)),而System.nanoTime則不與任何時(shí)間點(diǎn)相關(guān)。
Float還是double
在對(duì)精度要求高的場(chǎng)景下,double類(lèi)型相對(duì)float要更流行一些,理由如下:
大多數(shù)處理器在處理float和double上所需的時(shí)間都是差不多的。而計(jì)算時(shí)間一樣的前提下,double類(lèi)型卻能提供更高的精度。
冪運(yùn)算
Java是通過(guò)異或操作來(lái)進(jìn)行冪運(yùn)算的。Java對(duì)于冪運(yùn)算有兩種處理方式:
乘積:
pow方法:在無(wú)法使用乘積的情況下可以使用pow方法。
double cube = Math.pow(base, exponent);
不到萬(wàn)不得已不要使用Math.pow。比方說(shuō),當(dāng)指數(shù)是小數(shù)的時(shí)候。因?yàn)镸ath.pow要比乘積慢300-600倍左右。
如何處理空指針異常
空指針異常是Java中很常見(jiàn)的異常。當(dāng)你嘗試調(diào)用一個(gè)對(duì)象上的方法時(shí)便會(huì)拋出這個(gè)異常。比如:
int noOfStudents = school.listStudents.count;
在上述例子中,school為空或者listStudents為空都可能會(huì)拋出了PointerException。因此最好檢查下對(duì)象是否為空以避免類(lèi)似情況。
JSON編碼
JSON是數(shù)據(jù)存儲(chǔ)及傳輸?shù)囊环N協(xié)議。與XML相比,它更易于使用。由于它非常輕量級(jí)以及自身的一些特性,現(xiàn)在JSON在網(wǎng)絡(luò)上已經(jīng)是越來(lái)越流行了。常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)都可以編碼成JSON然后在各個(gè)網(wǎng)頁(yè)間自由地傳輸。不過(guò)在開(kāi)始編碼前,你得先安裝一個(gè)JSON解析器。在下面的例子中,我們將使用json.simple庫(kù)來(lái)完成這項(xiàng)工作 (https://code.google.com/p/json-simple/)。
下面是編碼成JSON串的一個(gè)簡(jiǎn)單的例子。
輸出:
{'Novel Name':'Godaan','Novel Details':['Language: Hindi','Year of Publication: 1936','Publisher: Lokmanya Press'],'Author':'Munshi Premchand'}
JSON解析
開(kāi)發(fā)人員要想解析JSON串,首先你得知道它的格式。下面例子有助于你來(lái)理解這一點(diǎn):
【Java新手問(wèn)題】相關(guān)文章:
Java新手必讀手冊(cè)10-31
新手如何學(xué)習(xí)Java07-06
新手學(xué)習(xí)java語(yǔ)言的方法09-25
新手開(kāi)車(chē)常見(jiàn)的問(wèn)題06-18
Java中finally的問(wèn)題09-28