必須瞭解的Java 基礎題

Java 基礎

1: 

int a = 1; 

int m1 = ++a +3;

結果 :m1 = 5;a=2;

++a表示先賦值

 

2:

int a = 1; 

int m = a+++3;

結果 m = 4; a= 2;

a++表示後賦值

 

3

 m<<2 表示 m*2*2

 m<< 3 表示 m*2*2*2

 int result =5<<2 ;//a  20  5*2*2 ;

 int result1 =6<<3 ;//   48  6*2*2*2

 int result2 =7<<4 ;//112  7*2*2*2*2

 

 

4:

a++ 表示a+1 

int a = 2;

int result = (a++ > 2)?(++a):(a+=3);

結果是//6

 

 5. 下面程序的運行結果是()

String str1 = "hello";String str2 = "he" + new String("llo");System.err.println(str1 == str2);

答案:false

解析:因爲str2中的llo是新申請的內存塊,而==判斷的是對象的地址而非值,所以不一樣。如果是String str2 .equals(str1),那麼就是true了。

 

4. 下列說法正確的有()

A. class中的constructor不可省略

B. constructor必須與class同名,但方法不能與class同名

C. constructor在一個對象被new時執行

D.一個class只能定義一個constructor

答案:C 

解析:這裏可能會有誤區,其實普通的類方法是可以和類名同名的,和構造方法唯一的區分就是,構造方法沒有返回值。

 

  1. 下面程序的運行結果:()

public static void main(String args[]) {        Thread t = new Thread() {             public void run() {                pong();            }        };       

  t.run();        System.out.print("ping");     }     static void pong() {         System.out.print("pong");     }

A pingpong        B pongping       C pingpong和pongping都有可能       D 都不輸出

答案:B

解 析:這裏考的是Thread類中start()和run()方法的區別了。start()用來啓動一個線程,當調用start方法後,系統纔會開啓一個新 的線程,進而調用run()方法來執行任務,

而單獨的調用run()就跟調用普通方法是一樣的,已經失去線程的特性了。因此在啓動一個線程的時候一定要使 用start()而不是run()。

 

7. 下列屬於關係型數據庫的是()

A. Oracle    B MySql    C IMS     D MongoDB

答案:AB

解答:IMS(Information Management System )數據庫是IBM公司開發的兩種數據庫類型之一; 

一種是關係數據庫,典型代表產品:DB2;

另一種則是層次數據庫,代表產品:IMS層次數據庫。

非關係型數據庫有MongoDB、memcachedb、Redis等。

 

8. GC線程是否爲守護線程?()

答案:是

解析:線程分爲守護線程和非守護線程(即用戶線程)。

只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最後一個非守護線程結束時,守護線程隨着JVM一同結束工作。

守護線程最典型的應用就是 GC (垃圾回收器)

 

9. volatile關鍵字是否能保證線程安全?()

答案:不能

解析:volatile關鍵字用在多線程同步中,可保證讀取的可見性,JVM只是保證從主內存加載到線程工作內存的值是最新的讀取值,而非cache中。但多個線程對

volatile的寫操作,無法保證線程安全。例 如假如線程1,線程2 在進行read,load 操作中,發現主內存中count的值都是5,那麼都會加載這個最新的值,在線程1堆count進行修改之後,

會write到主內存中,主內存中的 count變量就會變爲6;線程2由於已經進行read,load操作,在進行運算之後,也會更新主內存count的變量值爲6;導致兩個線程及時用 volatile關鍵字修改之後,還是會存在併發的情況。

 

10. 下列說法正確的是()

A LinkedList繼承自List

B AbstractSet繼承自Set

C HashSet繼承自AbstractSet

D WeakMap繼承自HashMap

答案:AC

解析:下面是一張下載的Java中的集合類型的繼承關係圖,一目瞭然。

 

 

11. 存在使i + 1 < i的數嗎()

答案:存在

解析:如果i爲int型,那麼當i爲int能表示的最大整數時,i+1就溢出變成負數了,此時不就<i了嗎。

擴展:存在使i > j || i <= j不成立的數嗎()

答案:存在

解析:比如Double.NaN或Float.NaN,

 

12. 0.6332的數據類型是()

A float     B double     C Float      D Double

答案:B

解析:默認爲double型,如果爲float型需要加上f顯示說明,即0.6332f

 

13. 下面哪個流類屬於面向字符的輸入流(  )

A  BufferedWriter           B  FileInputStream          C  ObjectInputStream          D  InputStreamReader

 答案:D

 解析:Java的IO操作中有面向字節(Byte)和麪向字符(Character)兩種方式。
面向字節的操作爲以8位爲單位對二進制的數據進行操作,對數據不進行轉換,這些類都是InputStream和OutputStream的子類。
面向字符的操作爲以字符爲單位對數據進行操作,在讀的時候將二進制數據轉爲字符,在寫的時候將字符轉爲二進制數據,這些類都是Reader和Writer的子類。

總結:以InputStream(輸入)/OutputStream(輸出)爲後綴的是字節流;

          以Reader(輸入)/Writer(輸出)爲後綴的是字符流。

 

  1. 下面程序能正常運行嗎()

public class NULL {     public static void haha(){        System.out.println("haha");    }    public static void main(String[] args) {        ((NULL)null).haha();    } }

答案:能正常運行

解析:輸出爲haha,因爲null值可以強制轉 換爲任何java類類型,(String)null也是合法的。但null強制轉換後是無效對象,其返回值還是爲null,而static方法的調用是和 類名綁定的,

不借助對象進行訪問所以能正確輸出。反過來,沒有static修飾就只能用對象進行訪問,使用null調用對象肯定會報空指針錯了。這裏和 C++很類似。

 

下面程序的運行結果是什麼()  

 class HelloA {     public HelloA() {        System.out.println("HelloA");    }        { System.out.println("I'm A class"); }        

static { System.out.println("static A"); } }public class HelloB extends HelloA {    public HelloB() {        System.out.println("HelloB");    } 

{ System.out.println("I'm B class"); }  

static { System.out.println("static B"); }        public static void main(String[] args) {      new HelloB();    } }

答案

static Astatic BI'm A classHelloAI'm B classHelloB

解析:說實話我覺得這題很好,考查靜態語句塊、構造語句塊(就是隻有大括號的那塊)以及構造函數的執行順序。

對象的初始化順序:(1)類加載之後,按從上到下(從父類到子類)執行被static修飾的語句;(2)當static語句執行完之後,再執行main方法;

(3)如果有語句new了自身的對象,將從上到下執行構造代碼塊、構造器(兩者可以說綁定在一起)。

 

下面稍微修改下上面的代碼,以便更清晰的說明情況:

class HelloA {     public HelloA() {        System.out.println("HelloA");    }        { System.out.println("I'm A class"); }        

static { System.out.println("static A"); } }public class HelloB extends HelloA {    public HelloB() {        System.out.println("HelloB");    }      

 { System.out.println("I'm B class"); }        static { System.out.println("static B"); }        public static void main(String[] args) {         System.out.println("-------main start-------");       

 new HelloB();        new HelloB();        System.out.println("-------main end-------");    }}

static Astatic B-------main start-------I'm A classHelloAI'm B classHelloBI'm A classHelloAI'm B classHelloB-------main end-------

 

  1. Java7中的switch支持String的實現細節

在Java7之前,switch只能支持 byte、short、char、int或者其對應的封裝類以及Enum類型。在Java7中,呼籲很久的String支持也終於被加上了。

public class Test {     public void test(String str) {        switch(str) {        case "abc":            System.out.println("abc");            break;        case "def":     

System.out.println("def");            break;        default:            System.out.println("default");        }    } }

 

 

5:

16進制數必須以 0x開頭

&是位操作符,“按位與”
1轉成二進制 01
2轉成二進制 10  
 

  1. 與運算符
    與運算符用符號“&”表示,其使用規律如下:
    兩個操作數中位都爲1,結果才爲1,否則結果爲0,例如下面的程序段。
    public class data13
    {
    public static void main(String[] args)
    {
    int a=129;
    int b=128;
    System.out.println("a 和b 與的結果是:"+(a&b));
    }
    }
    運行結果
    a 和b 與的結果是:128
    下面分析這個程序:
    “a”的值是129,轉換成二進制就是10000001,而“b”的值是128,轉換成二進制就是10000000。根據與運算符的運算規律,只有兩個位都是1,結果纔是1,可以知道結果就是10000000,即128。  2*2*2*2*2*2*2    

 

 

int a = 1234566;

查詢a的二進制Integer.toBinaryString(a);

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