Posted on 2007-11-01 17:12
Raylong 閱讀(1155)
評論(14) 編輯 收藏 所屬分類:
感想隨筆
早上看了java類庫中java.util.Arrays 類的toString方法的源代碼。如下:(這是JDK1.6的源代碼)
public static String toString(long[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
for循環有點奇怪,中間的那個表達式是空的。其實即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個效果的,純粹是多余的,但是我就是多余地加上了這條,結果編譯出錯了!提示我沒有返回語句!
我又重新編寫了兩個小程序來驗證一下:
下面這個能通過編譯:
class Test{
static String m(){
int a =10;
for (int i = 0; ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
for循環的中間語句是空的。
下面這個就不能編譯了:
class Test{
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
其實加上的語句并沒有改變原來邏輯結構。這是為什么呢?
如果在for的外面加上一個return語句,隨便返回什么字符串,又能通過編譯了!!!這個字符串永遠不能輸出的!!!根本就是個擺設!!!
class Test{
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
return "never be touch!!!";
}
public static void main (String[] args) {
System.out.println (m());
}
}
另外如果像下面這樣在for的中間表達式加上一個恒等式,又能通過編譯了!!!這是為什么呢?請高手指點!
class Test{
static String m(){
int a =10;
for (int i = 0; true==true ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
附:這是JDK1.5的源碼,謝謝GrayWolf!
1.6的代碼到底比1.5的改進在哪里呢?我覺得1.5版的實現比較清晰,可讀性好一點。
# public static String toString(long[] a) {
# if (a == null)
# return "null";
# if (a.length == 0)
# return "[]";
#
# StringBuilder buf = new StringBuilder();
# buf.append('[');
# buf.append(a[0]);
#
# for (int i = 1; i < a.length; i++) {
# buf.append(", ");
# buf.append(a[i]);
# }
#
# buf.append("]");
# return buf.toString();
# }