【牛客網】-- 日日刷(第一天)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章