牛客網錯題集錦9

1.管道

 管道實際上是一種固定大小的緩衝區,管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在於內存中。它類似於通信中半雙工信道的進程通信機制,一個管道可以實現雙向 的數據傳輸,而同一個時刻只能最多有一個方向的傳輸,不能兩個方向同時進行。管道的容 量大小通常爲內存上的一頁,它的大小並不是受磁盤容量大小的限制。當管道滿時,進程在 寫管道會被阻塞,而當管道空時,進程讀管道會被阻塞。
 
由於管道採用半雙工通信方式。因此,數據只能在一個方向上流動

管道是由內核管理的一個緩衝區,其容量受多方面因素影響,包括緩衝區的大小、磁盤容量大小等問題 

當管道中沒有信息的話,從管道中讀取的進程會等待,直到另一端的進程放入信息。當管道被放滿信息的時候,嘗試放入信息的進程會等待,直到另一端的進程取出信息。當兩個進程都終結的時候,管道也自動消失。進程對管道進行讀操作和寫操作都可能被阻塞,因此C正確 

管道的一端連接一個進程的輸出。這個進程會向管道中放入信息。管道的另一端連接一個進程的輸入,這個進程取出被放入管道的信息,管道可以同時進行讀進程和寫進程 

參考網址:http://www.cnblogs.com/biyeymyhjob/archive/2012/11/03/2751593.html 


2.

  先來看一段代碼:


public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }

    public static int beforeFinally() {
        int a = 0;
        try {
            a = 1;
            return a;
        } finally {
            a = 2;
        }
    }
} /**
 * output: 1*/

從結果上看,貌似`finally` 裏的語句是在`return` 之後執行的,其實不然,實際上`finally` 裏的語句是在在`return` 之前執行的。那麼問題來了,既然是在之前執行,那爲什麼`a` 的值沒有被覆蓋了?
實際過程是這樣的:當程序執行到try{}語句中的return方法時,它會幹這麼一件事,將要返回的結果存儲到一個臨時棧中,然後程序不會立即返回,而是去執行finally{}中的程序, 在執行`a = 2`時,程序僅僅是覆蓋了a的值,但不會去更新臨時棧中的那個要返回的值 。執行完之後,就會通知主程序“finally的程序執行完畢,可以請求返回了”,這時,就會將臨時棧中的值取出來返回。這下應該清楚了,要返回的值是保存至臨時棧中的。
再來看一個例子,稍微改下上面的程序:
public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }

    public static int beforeFinally() {
        int a = 0;
        try {
            a = 1;
            return a;
        } finally {
            a = 2;
            return a;
        }
    }
} /**
 * output: 2
 */

在這裏,finally{}裏也有一個return,那麼在執行這個return時,就會更新臨時棧中的值。同樣,在執行完finally之後,就會通知主程序請求返回了,即將臨時棧中的值取出來返回。故返回值是2.



再對比下面一題

 (單選題)

下面程序的輸出是什麼?




public class Test {
    public static String output = " ";

    public static void foo(int i) {
        try {
            if (i == 1) {
                throw new Exception();
            }
        } catch (Exception e) {
            output += "2";
            return;
        } finally {
            output += "3";
        } output += "4";
    }

    public static void main(String[] args) {
        foo(0);
        foo(1);
        System.out.println(output);
    }
}

答案 3423



參考如下代碼

public class Test {
    public static String output = "";

    public static String foo(int i) {
        try {
            if (i == 1) {
                throw new Exception();
            }
        } catch (Exception e) {
            output +="2";
            return output;
        } finally {
            output +="3";
        } output +="4";
        return output;
    }

    public static void main(String[] args) {
//        foo(0);
//        System.out.println(output);//輸出34
//        foo(1);
//        System.out.println(output);//輸出23
//        System.out.println(foo(0));//輸出34
//        System.out.println(foo(1));//輸出2
    }
}

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