1. 程式人生 > >牛客網錯題集系列(三)

牛客網錯題集系列(三)

目錄

1.關於Integer的一個問題

2.關於泛型的一道題

3.關於Integer型別超過128時的一道題

4.以下哪一個不是賦值符號?

5.關於try/catch/finally

6.關於for迴圈的執行順序問題

7.下面程式碼的輸出結果是什麼?

8.多執行緒的run()和start()方法的區別

9.~的使用

10 關於Java記憶體分佈的一道題

11不能用來修飾interface的有( )(僅限外部介面)

12.小的知識點,關於封裝類和String的一個小細節


1.關於Integer的一個問題

設有下面兩個賦值語句:

a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述說法正確的是()

a是整數型別變數,b是整數類物件。
a是整數類物件,b是整數型別變數。
a和b都是整數類物件並且它們的值相等。
a和b都是整數型別變數並且它們的值相等。

parseInt是把一個String型別的變數轉化為int的基礎資料型別的,valueOf是把一個String型別的值轉換成一個Integer型別的值,intValue將返回一個int的基礎資料型別的值。

 

2.關於泛型的一道題

以下說法錯誤的是()

虛擬機器中沒有泛型,只有普通類和普通方法
所有泛型類的型別引數在編譯時都會被擦除
建立泛型物件時請指明型別,讓編譯器儘早的做引數檢查
泛型的型別擦除機制意味著不能在執行時動態獲取List<T>中T的實際型別

 

錯誤原因  可以通過反射機制

3.關於Integer型別超過128時的一道題

以下程式碼執行的結果顯示是多少( )?

5994168_1502784155531_7C413AC0BAB7916AB91B0C47B8F34D18 (358×210)

 

true,false,true
false,true,false
true,true,false
false,false,true

如果Integer型別的值在-128到127之間,那麼就會建立相應的快取,而超出這個範圍則新建一個物件。

如果Integer型別的值大於128,那麼就會建立一個新的物件。

4.以下哪一個不是賦值符號?

+=
<<=
<<<=
>>>=

第四個是右移一位然後賦值

5.關於try/catch/finally

在try的括號裡面有return一個值,那在哪裡執行finally裡的程式碼?

 

不執行finally程式碼
return前執行
return後執行

6.關於for迴圈的執行順序問題

 

public class Test
{
    static boolean foo(char c)
    {
        System.out.print(c);
        return true;
    }
    public static void main( String[] argv )
    {
        int i = 0;
        for ( foo('A'); foo('B') && (i < 2); foo('C'))
        {
            i++ ;
            foo('D');
        }
    }
}
What is the result?
ABDCBDCB
ABCDABCD
Compilation fails.
An exception is thrown at runtime.

for(條件一;條件二;條件三){

執行語句

}

在這個for迴圈中的執行順序將是 條件一 →條件二(檢查是否滿足條件二來判斷是否繼續執行下去)→ 執行語句 →條件三

 

7.下面程式碼的輸出結果是什麼?

public class ZeroTest {
    public static void main(String[] args) {
     try{
       int i = 100 / 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
 }
 }
3
123
1
12

關於這道題,我之前也確實看了關於異常的一些知識點,可還是在這道題上出錯了。

100/0時會丟擲異常這個時候在try中的程式碼塊就不在執行了。開始執行catch的程式碼塊,但是在catch中又丟擲了一個異常,那麼程式就會在這個地方停止執行(除了執行finally中的程式碼以外)

8.多執行緒的run()和start()方法的區別

以下JAVA程式的輸出是什麼()

public class HelloSogou{
     public static synchronized void main(String[] a){
         Thread t=new Thread(){
             public void run(){Sogou();}
     };
     t.run();
     System.out.print("Hello");
     }
     static synchronized void Sogou(){
     System.out.print("Sogou");
    }
}
HelloSogou

SogouHello

Hello
結果不確定

就這道題而言,僅呼叫run()方法而沒有呼叫start()方法時,run()方法只是一個普通的方法呼叫,並沒有開啟一個執行緒。

如果將run()方法改成start()的話,問題就會變複雜許多了。

方法Sougou()和main()持有的都是HelloSougou.class鎖,所以方法是同步執行的。當在main()方法裡面開啟一個子執行緒進入就緒狀態準備呼叫時,需要獲取到HelloSougou.class鎖,但是這個時候這個鎖還有main()方法進行控制,只有等main()方法執行完畢後我們才可以讓Sougou()方法獲取到HelloSougou.class鎖進行執行,這個時候輸出的順序就是HelloSougou。

9.~的使用

What results from the following code fragment?

1

2

3

int i = 5;

int j = 10;

System.out.println(i + ~j);

 

~n = -n-1

具體原理就是 

在計算機中,儲存的都是數字的補碼。對n求補碼,然後將n的補碼按位取反再減一求出來反碼。然後再把反碼按位取反求出來的就是~n的原碼。

10 關於Java記憶體分佈的一道題

下列Java程式碼中的變數a、b、c分別在記憶體的____儲存區存放。

1

2

3

4

5

6

7

class A {

    private String a = “aa”;

    public boolean methodB() {

        String b = “bb”;

        final String c = “cc”;

    }

}

 

堆區、棧區、棧區

這道題後面兩個都很好說b,c作為引用放在了棧區,但是"bb","cc"和"aa"都是在靜態區的。

11不能用來修飾interface的有( )(僅限外部介面)

private
public
protected
static

介面是一種特殊的抽象類,介面中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象類中的抽象方法不能用的訪問修飾符這裡也不能用。而且protected訪問修飾符也不能使用,因為介面可以讓所有的類去實現(非繼承),不只是其子類,但是要用public去修飾。介面可以去繼承一個已有的介面。

12.小的知識點,關於封裝類和String的一個小細節

        Integer a = 9;
		Integer b = 9;
		System.out.println(a==b);
	Integer a = new Integer(9);
		Integer b = new Integer(9);
		System.out.println(a==b);

輸出的結果一個是true,一個是false。原因是當我們使用new的時候,我們會在堆區建立一個新的物件。==比較的是兩個物件的地址是否相同。所以會是false。但是上方的程式碼考慮到Integer的快取機制,a和b指向的都是同一塊記憶體區域,所以是true。