av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語言

Java初學(xué)者的30個(gè)常見問題

時(shí)間:2025-06-01 15:06:22 java語言 我要投稿
  • 相關(guān)推薦

Java初學(xué)者的30個(gè)常見問題

  大家在學(xué)習(xí)Java語言時(shí)都遇到過哪一些問題呢?本文回答了30個(gè)Java入門級初學(xué)者的常見問題。希望可以幫助到大家!

  我可以用%除以一個(gè)小數(shù)嗎? a += b 和 a = a + b 的效果有區(qū)別嗎? 聲明一個(gè)數(shù)組為什么需要花費(fèi)大量時(shí)間? 為什么Java庫不用隨機(jī)pivot方式的快速排序?

  1.2 基本數(shù)據(jù)類型

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

  A. 在Java里,整數(shù)是用補(bǔ)碼表示的。在補(bǔ)碼中0只有一種表示方法。另一方面,浮點(diǎn)數(shù)則是用 IEEE 標(biāo)準(zhǔn)表示的, 對于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 都是基本類型變量時(shí),a += b 和 a = a + b 的效果有區(qū)別嗎?

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

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

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

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

  Q. 有沒有在什么情況下,一條語句塊的花括號不能省略的?

  A. 在下面的例子中,第一段代碼是合法的,第二段代碼會(huì)引發(fā)編譯錯(cuò)誤。從技術(shù)角度說,那一條語句是一個(gè)變量聲明,而不是語句,所以會(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. 在下面的兩段代碼里,有沒有情況,它們的效果不一樣?

  for ( ; ) { } ; while () { }

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

  1.4 數(shù)組

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

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

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

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

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

  A. 下標(biāo)小于0 或者 大于等于數(shù)組長度,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. 好問題。這條語句打印出的是 數(shù)組在內(nèi)存中的地址,不幸的是,在絕大多數(shù)情況下,這不是你需要的。

  1.5 輸入輸出語句

  Q. 我可以從標(biāo)準(zhǔn)input中重新讀一次數(shù)據(jù)嗎?

  A. 不可以,你只能讀一次。

  Q. 怎樣輸入 end-of-file (eof) 符號?

  A. 操作系統(tǒng)自動(dòng)包括它了。

  Q. 使用 printf() 時(shí)還有哪些用法?

  A. 對于整數(shù)來說,使用 o 輸出八進(jìn)制,使用 x 輸出十六進(jìn)制。對于浮點(diǎn)數(shù)來說,使用 e 或者 g 輸出科學(xué)計(jì)數(shù)法形式。

  Q. 行結(jié)束的符號是什么?

  A. 不同的文件系統(tǒng)使用了不同的符號。在 Unix 系統(tǒng)上,新行的符號是 ' ' ;在 Windows 系統(tǒng)上,每一行都有兩個(gè)字符組成的字符串終結(jié) " " ;在 Macs 系統(tǒng)上,終結(jié)符號是 " " 。如果要打印行號,可以使用 System.out.println() ,或者使用下面的語句得到當(dāng)前操作系統(tǒng)下的行結(jié)束符:

  String NEWLINE = System.getProperty("line.separator");

  Q. 下面兩種寫法,哪一種更有效率?

  String s; while (!StdIn.isEmpty()) { while (!StdIn.isEmpty()) { s = StdIn.readString(); String s = StdIn.readString(); ... ... } }

  A. 從效率角度說,兩者沒有區(qū)別。 但是第二種寫法更好,因?yàn)樗拗屏俗兞康淖饔糜颉?/p>

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

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

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

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

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

  2.3 遞歸調(diào)用

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

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

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

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

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

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

  Q. 我擔(dān)心使用遞歸代碼時(shí)的空間開銷和重復(fù)計(jì)算(例如用遞歸解Fibonacci)的問題。有沒有其他需要擔(dān)心的?

  A. 在遞歸代碼中創(chuàng)建大數(shù)據(jù)類型(比如數(shù)組)時(shí)需要額外注意,隨著遞歸的推進(jìn),內(nèi)存使用將會(huì)迅速增加,由于內(nèi)存使用增加,操作系統(tǒng)管理內(nèi)存的時(shí)間開銷也會(huì)增加。

  4.2 排序與查找

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

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

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

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

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

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

  4.3 棧和隊(duì)列

  Q. 在Java庫中有對stacks 和 queues 的實(shí)現(xiàn)嗎?

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

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

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

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

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

  根本的原因是JAVA中的數(shù)組是“協(xié)變的(covariant)”,但是泛型并不是。比如, String[] 是 Object[]的一種子類型,但是 Stack并不是 Stack

【Java初學(xué)者的30個(gè)常見問題】相關(guān)文章:

初學(xué)者JAVA學(xué)習(xí)入門04-15

Java設(shè)計(jì)常見問題08-12

Java常見問題集錦04-13

Java編程常見問題07-19

Java編程的常見問題05-15

Java初學(xué)者的學(xué)習(xí)路線方法01-29

初學(xué)者學(xué)習(xí)Java語言的方法03-11

java初學(xué)者必須掌握的單詞06-17

Java編程常見問題匯總06-12