溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

分享一些Java初學(xué)者必須要會(huì)的知識(shí)點(diǎn)

發(fā)布時(shí)間:2020-11-12 16:21:43 來(lái)源:億速云 閱讀:134 作者:Leah 欄目:編程語(yǔ)言

分享一些Java初學(xué)者必須要會(huì)的知識(shí)點(diǎn)?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

基本數(shù)據(jù)類(lèi)型

Q. 為什么 -0/3 結(jié)果是 0,而 -0.0/3.0 結(jié)果是 -0.0?(注意后邊的結(jié)果0帶負(fù)號(hào))

A. 在Java里,整數(shù)是用補(bǔ)碼表示的。在補(bǔ)碼中0只有一種表示方法。另一方面,浮點(diǎn)數(shù)則是用 IEEE 標(biāo)準(zhǔn)表示的, 對(duì)于0有兩種表示方法, 0 和 -0。

Q. 我可以用 % 除以一個(gè)小數(shù)嗎?

A. 當(dāng)然可以。比如,如果 angle 是一個(gè)非負(fù)數(shù),那么 angle % (2 * Math.PI) 就會(huì)把 angle 轉(zhuǎn)換到 0 到 2 π 之間。

Q. 當(dāng) a b 都是基本類(lèi)型變量時(shí),a += b 和 a = a + b 的效果有區(qū)別嗎?

A. 當(dāng) a 和 b 的類(lèi)型不同時(shí),那兩條語(yǔ)句的效果就可能有區(qū)別。 a += b 等同于 a = (int) (a + b),這種情況下可以是 a是int型,b是float型。但是同等情況下 a = a + b 就會(huì)編譯報(bào)錯(cuò)。 

條件語(yǔ)句和循環(huán)語(yǔ)句

Q. 為什么判斷字符串相等不能使用 == ?

A. 這反映了基礎(chǔ)類(lèi)型(int, double, boolean)和引用類(lèi)型(String)的區(qū)別。

Q. 有沒(méi)有在什么情況下,一條語(yǔ)句塊的花括號(hào)不能省略的?

A. 在下面的例子中,第一段代碼是合法的,第二段代碼會(huì)引發(fā)編譯錯(cuò)誤。從技術(shù)角度說(shuō),那一條語(yǔ)句是一個(gè)變量聲明,而不是語(yǔ)句,所以會(huì)報(bào)錯(cuò)。

// legal 
for (int i = 0; i <= N; i++) { 
 int x = 5; 
} 
// illegal 
for (int i = 0; i <= N; i++) 
 int x = 5; 

Q. 在下面的兩段代碼里,有沒(méi)有情況,它們的效果不一樣?

for (<init stmnt> <boolean expr>; <incr stmnt>) { 
 <body statements> 
} 
<init stmnt>; 
while (<boolean expr>) { 
 <body statements> 
 <incr stmnt> 
} 

A. 有的。如果在循環(huán)塊里使用 continue 語(yǔ)句。在for的代碼里,計(jì)數(shù)器會(huì)加一;而在while的代碼里,因?yàn)楸籧ontinue略過(guò)了,計(jì)數(shù)器不加一。 

 數(shù)組

Q. 某些Java開(kāi)發(fā)人員使用 int a[] 而不是 int[] a 去聲明一個(gè)數(shù)組。這兩者有什么區(qū)別?

A. 在Java中這兩種用法都是合法的,他們的作用都是一樣的。前者是在C中的定義數(shù)組的方法。后者是JAVA推薦的方法,因?yàn)樗膶?xiě)法 int[] 更能表明這是一個(gè) int 的數(shù)組。

Q. 為什么數(shù)組下標(biāo)從0 開(kāi)始 而不是從 1 開(kāi)始?

A. 這種傳統(tǒng)起源于機(jī)器語(yǔ)言的編程方法。在機(jī)器語(yǔ)言中,數(shù)組下標(biāo)被用來(lái)計(jì)算元素位置與第一個(gè)元素之間的偏移量。如果從1開(kāi)始的話(huà),計(jì)算偏移時(shí)還需要做一次減法運(yùn)算,那是種浪費(fèi)。

Q. 如果我用 負(fù)數(shù) 作為數(shù)組下標(biāo)會(huì)發(fā)生什么事?

A. 下標(biāo)小于0 或者 大于等于數(shù)組長(zhǎng)度,JAVA運(yùn)行時(shí)會(huì)拋出 ArrayIndexOutOfBoundsException 異常,并且中止程序運(yùn)行。

Q. 使用數(shù)組時(shí)還有其他需要注意的陷阱嗎?

A. 需要記住,JAVA在你創(chuàng)建一個(gè)數(shù)組時(shí)會(huì)去初始化它,所以聲明一個(gè)數(shù)組需要 O(N)的時(shí)間。 

Q. 既然 a[] 是一個(gè)數(shù)組,為什么 System.out.println(a) 會(huì)打印出一個(gè)16進(jìn)制的數(shù),就像 @f62373 這樣,而不是打印出數(shù)組的元素?

A. 好問(wèn)題。這條語(yǔ)句打印出的是 數(shù)組在內(nèi)存中的地址,系統(tǒng)會(huì)自動(dòng)調(diào)用數(shù)組的toString()方法,這個(gè)問(wèn)題你可以看下toString()方法的源碼。

函數(shù)調(diào)用

Q. 當(dāng)把數(shù)組當(dāng)作函數(shù)調(diào)用時(shí)的參數(shù)時(shí),我常常感到疑惑?

A. 是的。你需要牢記傳值參數(shù)(參數(shù)是基本變量類(lèi)型)和傳引用參數(shù)(比如數(shù)組)之間的區(qū)別。

Q. 那為什么不把所有的參數(shù)都使用傳值的方式,包括對(duì)待數(shù)組?

A. 但數(shù)組很大時(shí),復(fù)制數(shù)組需要大量的性能開(kāi)銷(xiāo)。因?yàn)檫@個(gè)原因,絕大多數(shù)變成語(yǔ)言支持把數(shù)組傳入函數(shù)但不復(fù)制一個(gè)副本——MATLAB語(yǔ)言除外。

遞歸調(diào)用

Q. 有沒(méi)有只能用循環(huán)而不能用遞歸的情況?

A. 不可能,所有的循環(huán)都可以用遞歸替代,雖然大多數(shù)情況下,遞歸需要額外的內(nèi)存。

Q. 有沒(méi)有只能用遞歸而不能用循環(huán)的情況?

A. 不可能,所有的遞歸調(diào)用都可以用循環(huán)來(lái)表示。比如你可以用while的方式來(lái)實(shí)現(xiàn)棧。

Q. 那我應(yīng)該選擇哪個(gè),遞歸的方式 還是 循環(huán)的方式?

A. 根據(jù)代碼的可讀性和效率性之間做權(quán)衡。

Q. 我擔(dān)心使用遞歸代碼時(shí)的空間開(kāi)銷(xiāo)和重復(fù)計(jì)算(例如用遞歸解Fibonacci)的問(wèn)題。有沒(méi)有其他需要擔(dān)心的?
A. 在遞歸代碼中創(chuàng)建大數(shù)據(jù)類(lèi)型(比如數(shù)組)時(shí)需要額外注意,隨著遞歸的推進(jìn),內(nèi)存使用將會(huì)迅速增加,由于內(nèi)存使用增加,操作系統(tǒng)管理內(nèi)存的時(shí)間開(kāi)銷(xiāo)也會(huì)增加。

排序與查找

Q. 為什么我們要花大篇幅來(lái)證明一個(gè)程序是正確的?

A. 為了防止錯(cuò)誤的結(jié)果。二分查找就是一個(gè)例子。現(xiàn)在,你懂得了二分查找的原理,你就能把遞歸形式的二分查找改寫(xiě)成循環(huán)形式的二分查找。Knuth 教授在 1946年就發(fā)表了二分查找的論文,但是第一個(gè)正確的二分查找的程序在 1962年在出現(xiàn)。

Q. 在JAVA內(nèi)建庫(kù)中有沒(méi)有排序和查找的函數(shù)?

A. 有的。在 java.util.Arrays 中包含了 Arrays.sort() 和 Arrays.binarySearch() 方法。對(duì)于Comparable 類(lèi)型它使用了 歸并排序,對(duì)于基本數(shù)據(jù)類(lèi)型,它使用了快速排序。因?yàn)榛绢?lèi)型是值傳遞,快速排序比歸并排序更快而且不需要額外的空間。

Q. 為什么JAVA庫(kù)不用 隨機(jī)pivot方式的快速排序?

A. 好問(wèn)題。 因?yàn)槟承┏绦騿T在調(diào)試代碼時(shí),可能需要確定性的代碼實(shí)現(xiàn)。使用隨機(jī)pivot違背了這個(gè)原則。

棧和隊(duì)列

Q. 在Java庫(kù)中有對(duì)stacks 和 queues 的實(shí)現(xiàn)嗎&#63;

A. Java庫(kù)中內(nèi)建 java.util.Stack,但是你應(yīng)該避免使用它如果你需要一個(gè)真正的棧的話(huà)。因?yàn)樗菍?shí)現(xiàn)了額外的功能,比如訪(fǎng)問(wèn)第N個(gè)元素。另外,它也支持從棧底部插入元素,所以它看上去更像是一個(gè)隊(duì)列。盡管實(shí)現(xiàn)了這些額外的功能對(duì)編程人員是一個(gè)加分,可是我們使用數(shù)據(jù)結(jié)構(gòu)并不只是想使用所有功能,而是需要我們正好需要的那種結(jié)構(gòu)。JAVA對(duì)于棧的實(shí)現(xiàn)就是一個(gè)典型的寬接口的例子。

Q. 我想使用數(shù)組來(lái)表示一個(gè)包含泛型的棧,但是以下代碼編譯報(bào)錯(cuò)。為什么?

private Item[] a = new Item[max]; 
oldfirst = first; 

A. 不錯(cuò)的嘗試。不幸的是,創(chuàng)建一個(gè)泛型數(shù)組在 Java 1.5里不支持。你可以使用cast,比如下面的寫(xiě)法:

private Item[] a = (Item[]) new Object[max]; 
oldfirst = first; 

根本的原因是JAVA中的數(shù)組是“協(xié)變的(covariant)”,但是泛型并不是。比如, String[] 是 Object[]的一種子類(lèi)型,但是 Stack<String>并不是 Stack<Object> 的一種子類(lèi)型。 許多程序員認(rèn)為“協(xié)變的”數(shù)組是JAVA在數(shù)據(jù)類(lèi)型方面的一個(gè)缺點(diǎn)。但是,如果我們不考慮泛型,“協(xié)變的”數(shù)組是有用的,比如實(shí)現(xiàn) Arrays.sort(Comparable[]) 方法,然后當(dāng)參數(shù)是 String[]時(shí)它也可以被正常調(diào)用。

Q. 可不可以在數(shù)組上使用 foreach 方式?

A. 可以的(雖然 數(shù)組并沒(méi)有實(shí)現(xiàn) Iterator 接口)。請(qǐng)參考下面的代碼:

public static void main(String[] args) { 
  for (String s : args) 
  StdOut.println(s); 
} 

Q. 在 linked list 上使用 iterator 是不是比循環(huán)或者遞歸更有效率?

A. 編譯器在翻譯時(shí),可能把那種“尾遞歸”形式翻譯成等價(jià)的循環(huán)形式。所以可能并沒(méi)有可以被觀(guān)測(cè)到的性能提升。
尾部遞歸是一種編程技巧。如果在遞歸函數(shù)中,遞歸調(diào)用返回的結(jié)果總被直接返回,則稱(chēng)為尾部遞歸。尾遞歸是極其重要的,不用尾遞歸,函數(shù)的堆棧耗用難以估量,需要保存很多中間函數(shù)的堆棧。比如f(n, sum) = f(n-1) + value(n) + sum; 會(huì)保存n個(gè)函數(shù)調(diào)用堆棧,而使用尾遞歸f(n, sum) = f(n-1, sum+value(n)); 這樣則只保留后一個(gè)函數(shù)堆棧即可,之前的可優(yōu)化刪去。

Q. 自動(dòng)裝箱機(jī)制會(huì)怎么處理下面的情況?

Integer a = null; 
int b = a;

A.它將返回一個(gè)運(yùn)行時(shí)錯(cuò)誤?;A(chǔ)類(lèi)型不允許它對(duì)應(yīng)的裝箱類(lèi)型里的值是null。 

Q. 為什么第一組打印的是 true,但是后面兩組打印的是 false?

Integer a1 = 100; 
Integer a2 = 100; 
System.out.println(a1 == a2);  // true 
Integer b1 = new Integer(100); 
Integer b2 = new Integer(100); 
System.out.println(b1 == b2);  // false 
Integer c1 = 150; 
Integer c2 = 150; 
System.out.println(c1 == c2);  // false

A. 第二組代碼打印 false 是因?yàn)?b1 和 b2 指向不同的 Integer 對(duì)象引用。第一組和第三組依賴(lài)于自動(dòng)裝箱機(jī)制。 令人意外的第一組打印了 true 是因?yàn)樵?-128 和 127 之間的值會(huì)自動(dòng)轉(zhuǎn)換成同樣的immutable型的Integer 對(duì)象。對(duì)于超出那個(gè)范圍的數(shù),Java會(huì)對(duì)于每一個(gè)數(shù)創(chuàng)建一個(gè)新的Integer對(duì)象。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI