一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java初學者常問的問題(推薦)

Java初學者常問的問題(推薦)

2020-09-03 13:48Java之家 Java教程

本文介紹一些Java初學者常問的問題,很多朋友對可以用%除以一個小數嗎? a += b 和 a = a + b 的效果有區別嗎? 聲明一個數組為什么需要花費大量時間? 為什么Java庫不用隨機pivot方式的快速排序?等等一系列問題有疑惑,下面就通過

本文介紹一些Java初學者常問的問題,可以用%除以一個小數嗎? a += b 和 a = a + b 的效果有區別嗎? 聲明一個數組為什么需要花費大量時間? 為什么Java庫不用隨機pivot方式的快速排序?

基本數據類型

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

A. 在Java里,整數是用補碼表示的。在補碼中0只有一種表示方法。另一方面,浮點數則是用 IEEE 標準表示的, 對于0有兩種表示方法, 0 和 -0。

Q. 我可以用 % 除以一個小數嗎?

A. 當然可以。比如,如果 angle 是一個非負數,那么 angle % (2 * Math.PI) 就會把 angle 轉換到 0 到 2 π 之間。

Q. 當 a b 都是基本類型變量時,a += b 和 a = a + b 的效果有區別嗎?

A. 當 a 和 b 的類型不同時,那兩條語句的效果就可能有區別。 a += b 等同于 a = (int) (a + b),這種情況下可以是 a是int型,b是float型。但是同等情況下 a = a + b 就會編譯報錯。 

條件語句和循環語句

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

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

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

A. 在下面的例子中,第一段代碼是合法的,第二段代碼會引發編譯錯誤。從技術角度說,那一條語句是一個變量聲明,而不是語句,所以會報錯。

?
1
2
3
4
5
6
7
// legal
for (int i = 0; i <= N; i++) {
 int x = 5;
}
// illegal
for (int i = 0; i <= N; i++)
 int x = 5;

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

?
1
2
3
4
5
6
7
8
for (<init stmnt> <boolean expr>; <incr stmnt>) {
 <body statements>
}
<init stmnt>;
while (<boolean expr>) {
 <body statements>
 <incr stmnt>
}

A. 有的。如果在循環塊里使用 continue 語句。在for的代碼里,計數器會加一;而在while的代碼里,因為被continue略過了,計數器不加一。 

 數組

Q. 某些Java開發人員使用 int a[] 而不是 int[] a 去聲明一個數組。這兩者有什么區別?

A. 在Java中這兩種用法都是合法的,他們的作用都是一樣的。前者是在C中的定義數組的方法。后者是JAVA推薦的方法,因為它的寫法 int[] 更能表明這是一個 int 的數組。

Q. 為什么數組下標從0 開始 而不是從 1 開始?

A. 這種傳統起源于機器語言的編程方法。在機器語言中,數組下標被用來計算元素位置與第一個元素之間的偏移量。如果從1開始的話,計算偏移時還需要做一次減法運算,那是種浪費。

Q. 如果我用 負數 作為數組下標會發生什么事?

A. 下標小于0 或者 大于等于數組長度,JAVA運行時會拋出 ArrayIndexOutOfBoundsException 異常,并且中止程序運行。

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

A. 需要記住,JAVA在你創建一個數組時會去初始化它,所以聲明一個數組需要 O(N)的時間。 

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

A. 好問題。這條語句打印出的是 數組在內存中的地址,系統會自動調用數組的toString()方法,這個問題你可以看下toString()方法的源碼。

函數調用

Q. 當把數組當作函數調用時的參數時,我常常感到疑惑?

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

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

A. 但數組很大時,復制數組需要大量的性能開銷。因為這個原因,絕大多數變成語言支持把數組傳入函數但不復制一個副本——MATLAB語言除外。

遞歸調用

Q. 有沒有只能用循環而不能用遞歸的情況?

A. 不可能,所有的循環都可以用遞歸替代,雖然大多數情況下,遞歸需要額外的內存。

Q. 有沒有只能用遞歸而不能用循環的情況?

A. 不可能,所有的遞歸調用都可以用循環來表示。比如你可以用while的方式來實現棧。

Q. 那我應該選擇哪個,遞歸的方式 還是 循環的方式?

A. 根據代碼的可讀性和效率性之間做權衡。

Q. 我擔心使用遞歸代碼時的空間開銷和重復計算(例如用遞歸解Fibonacci)的問題。有沒有其他需要擔心的?
A. 在遞歸代碼中創建大數據類型(比如數組)時需要額外注意,隨著遞歸的推進,內存使用將會迅速增加,由于內存使用增加,操作系統管理內存的時間開銷也會增加。

排序與查找

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

A. 為了防止錯誤的結果。二分查找就是一個例子。現在,你懂得了二分查找的原理,你就能把遞歸形式的二分查找改寫成循環形式的二分查找。Knuth 教授在 1946年就發表了二分查找的論文,但是第一個正確的二分查找的程序在 1962年在出現。

Q. 在JAVA內建庫中有沒有排序和查找的函數?

A. 有的。在 java.util.Arrays 中包含了 Arrays.sort() 和 Arrays.binarySearch() 方法。對于Comparable 類型它使用了 歸并排序,對于基本數據類型,它使用了快速排序。因為基本類型是值傳遞,快速排序比歸并排序更快而且不需要額外的空間。

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

A. 好問題。 因為某些程序員在調試代碼時,可能需要確定性的代碼實現。使用隨機pivot違背了這個原則。

棧和隊列

Q. 在Java庫中有對stacks 和 queues 的實現嗎?

A. Java庫中內建 java.util.Stack,但是你應該避免使用它如果你需要一個真正的棧的話。因為它是實現了額外的功能,比如訪問第N個元素。另外,它也支持從棧底部插入元素,所以它看上去更像是一個隊列。盡管實現了這些額外的功能對編程人員是一個加分,可是我們使用數據結構并不只是想使用所有功能,而是需要我們正好需要的那種結構。JAVA對于棧的實現就是一個典型的寬接口的例子。

Q. 我想使用數組來表示一個包含泛型的棧,但是以下代碼編譯報錯。為什么?

?
1
2
private Item[] a = new Item[max];
oldfirst = first;

A. 不錯的嘗試。不幸的是,創建一個泛型數組在 Java 1.5里不支持。你可以使用cast,比如下面的寫法:

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

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

Q. 可不可以在數組上使用 foreach 方式?

A. 可以的(雖然 數組并沒有實現 Iterator 接口)。請參考下面的代碼:

?
1
2
3
4
public static void main(String[] args) {
  for (String s : args)
  StdOut.println(s);
}

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

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

Q. 自動裝箱機制會怎么處理下面的情況?

?
1
2
Integer a = null;
int b = a;

A.它將返回一個運行時錯誤。基礎類型不允許它對應的裝箱類型里的值是null。 

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

?
1
2
3
4
5
6
7
8
9
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 是因為 b1 和 b2 指向不同的 Integer 對象引用。第一組和第三組依賴于自動裝箱機制。 令人意外的第一組打印了 true 是因為在 -128 和 127 之間的值會自動轉換成同樣的immutable型的Integer 對象。對于超出那個范圍的數,Java會對于每一個數創建一個新的Integer對象。

以上所述是小編給大家介紹的Java初學者常問的問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草莓在深夜释放自己软件 | 婷婷网址 | 国产香蕉视频在线观看 | 国产午夜免费不卡精品理论片 | 美女大逼逼 | 午夜精品久久久久久 | 亚洲欧美在线免费观看 | 很黄的孕妇a级黄毛片 | yy8090韩国日本三理论免费 | 波多野结衣在线观看视频 | 欧美一卡2卡3卡四卡海外精品 | 98色花堂永久地址国产精品 | www.色香蕉| 日本妇人成熟免费不卡片 | 15同性同志18 | 艹出白浆 | 学生小泬无遮挡女HD | 毛片免费毛片一级jjj毛片 | 天天色色色 | 拔插拔插8x8x海外华人免费视频 | 精品成人一区二区三区免费视频 | h玉足嫩脚嗯啊白丝 | 99re热这里只有精品视频 | 欧美一级一级做性视频 | 海角社区在线视频 | 青青青青青 | 高清在线免费观看 | 掀开奶罩边躁狠狠躁软学生 | 国产大秀视频 | 思思99热久久精品在2019线 | 日本深夜视频 | 女子监狱第二季在线观看免费完整版 | 天天爽天天 | 扒开双腿猛进入爽爽视频ai | 香蕉久久一区二区三区啪啪 | 日韩一区二区在线视频 | 欧美高清在线 | 操美女bb| 性欧美videosex18嫩 | 国产麻豆精品免费视频 | 全肉np巨肉一女np高h双龙 |