
以下是各程序清單的執(zhí)行結(jié)果及核心要點(diǎn)解析Listing 1: DoubleDemoclass DoubleDemo { public static void main(String args[]) { Double d1 Double.valueOf(3.14159); Double d2 Double.valueOf(314159E-5); System.out.println(d1 d2 - d1.equals(d2)); } }執(zhí)行結(jié)果3.14159 3.14159 - true解析Double.valueOf(3.14159)和Double.valueOf(314159E-5)都創(chuàng)建了表示相同浮點(diǎn)數(shù)值的Double對(duì)象。Double.equals()方法比較的是包裝對(duì)象內(nèi)部的基本double值而非對(duì)象引用。由于兩個(gè)值在浮點(diǎn)數(shù)精度內(nèi)相等因此返回true。Listing 2: InfNaNclass InfNaN { public static void main(String args[]) { Double d1 Double.valueOf(1/0.); Double d2 Double.valueOf(0/0.); System.out.println(d1 : d1.isInfinite() , d1.isNaN()); System.out.println(d2 : d2.isInfinite() , d2.isNaN()); } }執(zhí)行結(jié)果Infinity: true, false NaN: false, true解析1/0.在浮點(diǎn)數(shù)運(yùn)算中結(jié)果為無窮大 (Infinity)isInfinite()返回true。0/0.在浮點(diǎn)數(shù)運(yùn)算中結(jié)果為“非數(shù)字” (NaN)isNaN()返回true。Listing 3: ParseDemoimport java.io.*; class ParseDemo { public static void main(String args[]) throws IOException { BufferedReader br new BufferedReader(new InputStreamReader(System.in)); String str; int i; int sum0; System.out.println(Enter numbers, 0 to quit.); do { str br.readLine(); try { i Integer.parseInt(str); } catch(NumberFormatException e) { System.out.println(Invalid format); i 0; } sum i; System.out.println(Current sum is: sum); } while(i ! 0); } }執(zhí)行結(jié)果示例交互Enter numbers, 0 to quit. 5 Current sum is: 5 10 Current sum is: 15 abc Invalid format Current sum is: 15 0 Current sum is: 15解析程序從標(biāo)準(zhǔn)輸入讀取數(shù)字字符串使用Integer.parseInt()進(jìn)行轉(zhuǎn)換并累加。輸入非數(shù)字字符串會(huì)拋出NumberFormatException被捕獲后提示并計(jì)為0。輸入0時(shí)循環(huán)終止。Listing 4: StringConversionsclass StringConversions { public static void main(String args[]) { int num 19648; System.out.println(num in binary: Integer.toBinaryString(num)); System.out.println(num in octal: Integer.toOctalString(num)); System.out.println(num in hexadecimal: Integer.toHexString(num)); } }執(zhí)行結(jié)果19648 in binary: 100110011000000 19648 in octal: 46300 19648 in hexadecimal: 4cc0Listing 5: IsDemoclass IsDemo { public static void main(String args[]) { char a[] {a, b, 5, ?, A, }; for(int i0; ia.length; i) { if(Character.isDigit(a[i])) System.out.println(a[i] is a digit.); if(Character.isLetter(a[i])) System.out.println(a[i] is a letter.); if(Character.isWhitespace(a[i])) System.out.println(a[i] is whitespace.); if(Character.isUpperCase(a[i])) System.out.println(a[i] is uppercase.); if(Character.isLowerCase(a[i])) System.out.println(a[i] is lowercase.); } } }執(zhí)行結(jié)果a is a letter. a is lowercase. b is a letter. b is lowercase. 5 is a digit. A is a letter. A is uppercase. is whitespace.Listing 6: MemoryDemoclass MemoryDemo { public static void main(String args[]) { Runtime r Runtime.getRuntime(); long mem1, mem2; Integer someints[] new Integer[1000]; System.out.println(Total memory is: r.totalMemory()); mem1 r.freeMemory(); System.out.println(Initial free memory: mem1); r.gc(); mem1 r.freeMemory(); System.out.println(Free memory after garbage collection: mem1); for(int i0; i1000; i) someints[i] Integer.valueOf(i); mem2 r.freeMemory(); System.out.println(Free memory after allocation: mem2); System.out.println(Memory used by allocation: (mem1-mem2)); for(int i0; i1000; i) someints[i] null; r.gc(); mem2 r.freeMemory(); System.out.println(Free memory after collecting discarded Integers: mem2); } }執(zhí)行結(jié)果示例具體數(shù)值因環(huán)境而異Total memory is: 130023424 Initial free memory: 128632160 Free memory after garbage collection: 129378880 Free memory after allocation: 129374152 Memory used by allocation: 4728 Free memory after collecting discarded Integers: 129378880解析展示了Runtime類中totalMemory()、freeMemory()和gc()方法的使用。gc()是建議JVM進(jìn)行垃圾回收不保證立即執(zhí)行。分配Integer對(duì)象數(shù)組會(huì)消耗內(nèi)存將其置為null并調(diào)用gc()后內(nèi)存被回收。Listing 7: ExecDemoclass ExecDemo { public static void main(String args[]) { Runtime r Runtime.getRuntime(); Process p null; try { p r.exec(notepad); } catch (Exception e) { System.out.println(Error executing notepad.); } } }執(zhí)行結(jié)果啟動(dòng) Windows 記事本程序 (notepad.exe)。程序會(huì)立即返回不會(huì)等待記事本關(guān)閉。Listing 8: ExecDemoFiniclass ExecDemoFini { public static void main(String args[]) { Runtime r Runtime.getRuntime(); Process p null; try { p r.exec(notepad); p.waitFor(); } catch (Exception e) { System.out.println(Error executing notepad.); } System.out.println(Notepad returned p.exitValue()); } }執(zhí)行結(jié)果啟動(dòng) Windows 記事本并調(diào)用p.waitFor()等待其進(jìn)程終止。關(guān)閉記事本后控制臺(tái)輸出其退出碼通常為0。Listing 9 20: VerDemoclass VerDemo { public static void main(String args[]) { Runtime.Version ver Runtime.version(); System.out.println(Major version: ver.major()); System.out.println(Minor version: ver.minor()); System.out.println(Security version: ver.security()); } }執(zhí)行結(jié)果示例取決于JDK版本Major version: 17 Minor version: 0Security version: 0Listing 10: PBDemoclass PBDemo { public static void main(String args[]) { try { ProcessBuilder proc new ProcessBuilder(notepad.exe, testfile); proc.start(); } catch (Exception e) { System.out.println(Error executing notepad.); } } }執(zhí)行結(jié)果使用ProcessBuilder啟動(dòng)記事本并嘗試打開名為testfile的文件。如果文件不存在記事本會(huì)新建一個(gè)空白文檔。Listing 11: Elapsedclass Elapsed { public static void main(String args[]) { long start, end; System.out.println(Timing a for loop from 0 to 100,000,000); start System.currentTimeMillis(); for(long i0; i 100000000L; i) ; end System.currentTimeMillis(); System.out.println(Elapsed time: (end-start)); } }執(zhí)行結(jié)果示例Timing a for loop from 0 to 100,000,000 Elapsed time: 25解析使用System.currentTimeMillis()測(cè)量一個(gè)空循環(huán)的執(zhí)行時(shí)間。Listing 12: ACDemoclass ACDemo { static byte a[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 }; static byte b[] { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 }; public static void main(String args[]) { System.out.println(a new String(a)); System.out.println(b new String(b)); System.arraycopy(a, 0, b, 0, a.length); System.out.println(a new String(a)); System.out.println(b new String(b)); System.arraycopy(a, 0, a, 1, a.length - 1); System.arraycopy(b, 1, b, 0, b.length1); System.out.println(a new String(a)); System.out.println(b new String(b)); } }執(zhí)行結(jié)果a ABCDEFGHIJ b MMMMMMMMMM a ABCDEFGHIJ b ABCDEFGHIJ a AABCDEFGHI b BCDEFGHIJJ解析演示System.arraycopy()方法進(jìn)行數(shù)組復(fù)制。第一次復(fù)制將a的內(nèi)容完全復(fù)制到b。第二次復(fù)制a自我復(fù)制導(dǎo)致元素右移b自我復(fù)制導(dǎo)致元素左移。Listing 13: ShowUserDirclass ShowUserDir { public static void main(String args[]) { System.out.println(System.getProperty(user.dir)); } }執(zhí)行結(jié)果輸出當(dāng)前 Java 進(jìn)程的工作目錄絕對(duì)路徑。Listing 14 15: CloneDemo 系列這兩個(gè)清單展示了兩種實(shí)現(xiàn)克隆的方式。Listing 14使用自定義的cloneTest()方法。Listing 15重寫了Object.clone()方法并提升為public。執(zhí)行結(jié)果兩者相同x1: 10 20.98 x2: 10 20.98解析實(shí)現(xiàn)了Cloneable接口的類才能進(jìn)行克隆。*克隆創(chuàng)建了原對(duì)象的一個(gè)副本副本的字段值與原對(duì)象相同。Listing 16: RTTIclass X { int a; float b; } class Y extends X { double c; } class RTTI { public static void main(String args[]) { X x new X(); Y y new Y(); Class? clObj; clObj x.getClass(); System.out.println(x is object of type: clObj.getName()); clObj y.getClass(); System.out.println(y is object of type: clObj.getName()); clObj clObj.getSuperclass(); System.out.println(ys superclass is clObj.getName()); } }執(zhí)行結(jié)果x is object of type: X y is object of type: Y ys superclass is X解析演示運(yùn)行時(shí)類型信息RTTI通過getClass()獲取對(duì)象的Class對(duì)象。Class.getName()返回類名getSuperclass()返回父類的Class對(duì)象。Listing 17: Anglesclass Angles { public static void main(String args[]) { double theta 120.0; System.out.println(theta degrees is Math.toRadians(theta) radians.); theta 1.312; System.out.println(theta radians is Math.toDegrees(theta) degrees.); } }執(zhí)行結(jié)果120.0 degrees is 2.0943951023931953 radians. 1.312 radians is 75.17206272116401 degrees.Listing 18: ThreadGroupDemo執(zhí)行結(jié)果摘要?jiǎng)?chuàng)建兩個(gè)線程組Group A 和 Group B每個(gè)組包含兩個(gè)線程。線程啟動(dòng)后打印倒數(shù)數(shù)字。主線程暫停 Group A 中的線程 4 秒然后恢復(fù)。所有線程執(zhí)行完畢后主線程退出。groupA.list()和groupB.list()會(huì)向標(biāo)準(zhǔn)錯(cuò)誤輸出線程組信息。Listing 19: PkgTestclass PkgTest { public static void main(String args[]) { Package pkgs[] Package.getPackages(); for(int i0; i pkgs.length; i) System.out.println( pkgs[i].getName() pkgs[i].getImplementationTitle() pkgs[i].getImplementationVendor() pkgs[i].getImplementationVersion() ); } }執(zhí)行結(jié)果輸出當(dāng)前類加載器加載的所有包的信息包括包名、實(shí)現(xiàn)標(biāo)題、供應(yīng)商和版本。輸出內(nèi)容因運(yùn)行環(huán)境和JDK版本而異可能很長(zhǎng)。參考來源java中system_Java中System類Soot Java程序分析與優(yōu)化實(shí)戰(zhàn)示例jacoco java_使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率jacoco java_使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率stopwatch java_利用StopWatch類監(jiān)控Java代碼執(zhí)行時(shí)間并分析性能