1、Java Application(Java 應用程序)源程序文件編譯後的字節碼文件的擴展名是( B )
A java B class C exe D jar
個人見解:
Java源文件在經過JVM(Java Virtual Machine)
Java虛擬機的編譯後會生成.class
文件,被叫做字節碼文件。而該文件正是Java可以被叫做跨平臺的原因,通過移動該字節碼文件到不同的操作系統上再通過JVM將字節碼文件翻譯成機器語言, 從而運行Java應用程序。
java是java
語言的源代碼文件的擴展名;
exe是windows
操作系統的可執行文件的擴展名;
jar是(Java Archive File
) Java壓縮文件 可以使用壓縮文件直接打開, 與壓縮文件不同的是再jar文件中存在一個文件META-INF/MANIFEST.MF
該文件是用於存儲包和擴展的配置數據。
2、不考慮反射,String
類型變量所指向內存空間中的內容是不能被改變的。(√ )
個人見解:
String
類型的變量在常量池中存儲,雖然不可以改變常量池中的內容,但是可以改變String
類型變量的引用地址,原常量池中的內容仍然存在,等待着地址指向它。
String s1 = "ABC";
String s2 = "ABC";
System.out.println(s1 == s2); //true
System.out.println(System.identityHashCode(s1)); //689401025
System.out.println(System.identityHashCode(s2)); //689401025
String s3 = "ABC";
String s4 = new String("ABC");
System.out.println(s3 == s4); //false
System.out.println(System.identityHashCode(s3)); //689401025
System.out.println(System.identityHashCode(s4)); //790067787
String s5 = new String("ABC");
String s6 = new String("ABC");
System.out.println(s5 == s6); //false
System.out.println(System.identityHashCode(s5)); //1115201599
System.out.println(System.identityHashCode(s6)); //343856911
不使用new
的方式去創建字符串是從字符串常量池中取出,使用new
的方式創建字符串是存在與堆(heap
)中。
3、下面程序的運行結果是
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
運行結果:false
個人見解:
str1
== str2
之所以返回false
是由於不通過new的方式創建String
對象是在編譯期就能確定其內存地址,然而通過new
的方式來創建對象時是在運行時纔會分配內存地址。因此程序無法確定str2的內容,因此無法判斷相等,而此時就需要通過equals
方法來進一步確認是否相等了。
上述內容只是在時間上來判斷,編譯期和運行期,而從對象存放的位置也可以判斷出對象不相等,不通過new
的方式來創建字符串時存放的空間是字符串常量池,而通過使用new
的方式創建字符串是存在與堆(heap
)中,這就與第二題牽扯到的內容等同了。
另:
String s1 = "hell" + "o"; //創建了3個對象 hell 、o 、hello