1. 程式人生 > >牛客網第15天

牛客網第15天

  1. public class Test {
    public static int a = 1;
    public static void main(String[] args) {
    int a = 10;
    a++; Test.a++;
    Test t=new Test();
    System.out.println(“a=” + a + " t.a=" + t.a);
    }
    }
    A.a=10 t.a=3
    B.a=11 t.a=2
    C.a=12 t.a=1
    D.a=11 t.a=1
    正確答案: B 你的答案: A (錯誤)
    解析:值為1的a屬於類變數也叫作成員變數,值為10的a是區域性變數 首先a++時就近原則,用區域性變數10來加,Text.a直接用類名呼叫成員變數的情況,只能是static 修飾的成員變數1來加,然後又例項化了物件,在輸出中第一個a= 用就近原則輸出11,第二個t.a 物件只能呼叫類變數輸出2
  2. 如下Java語句 double x=2.0; int y=4; x/=++y; 執行後,x的值是()
    A.0.5
    B.2.5
    C.0.4
    D.2.0
    正確答案: C 你的答案: C (正確)
    解析:x/=++y
    ++在前先+在用 所以可以等價為x/=5,所以答案為c
    3.下面關於垃圾收集的描述哪個是錯誤的?
    A.使用垃圾收集的程式不需要明確釋放物件
    B.現代垃圾收集能夠處理迴圈引用問題
    C.垃圾收集能提高程式設計師效率
    D.使用垃圾收集的語言沒有內在洩漏問題
    正確答案: D 你的答案: C (錯誤)
    解析:java的垃圾收集機制主要針對新生代和老年代的記憶體進行回收,不同的垃圾收集演算法針對不同的區域。所以java的垃圾收集演算法使用的是分代回收。一般java的物件首先進入新生代的Eden區域,當進行GC的時候會回收新生代的區域,新生代一般採用複製收集演算法,將活著的物件複製到survivor區域中,如果survivor區域裝在不下,就檢視老年代是否有足夠的空間裝下新生代中的物件,如果能裝下就裝下,否則老年代就執行FULL GC回收自己,老年代還是裝不下,就會丟擲OUtOfMemory的異常
    4.在基本JAVA型別中,如果不明確指定,整數型的預設是什麼型別?帶小數的預設是什麼型別?
    A.int float
    B.int double
    C.long float
    D.long double
    正確答案: B 你的答案: B (正確)
    解析:記住即可
    5.下面有關JVM記憶體,說法錯誤的是?
    A.程式計數器是一個比較小的記憶體區域,用於指示當前執行緒所執行的位元組碼執行到了第幾行,是執行緒隔離的
    B.Java方法執行記憶體模型,用於儲存區域性變數,運算元棧,動態連結,方法出口等資訊,是執行緒隔離的
    C.方法區用於儲存JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料,是執行緒隔離的
    D.原則上講,所有的物件都在堆區上分配記憶體,是執行緒之間共享的
    正確答案: C 你的答案: C (正確)
    解析:
    執行時資料區包括:虛擬機器棧區,堆區,方法區,本地方法棧,程式計數器
    虛擬機器棧區 :也就是我們常說的棧區,執行緒私有,存放基本型別,物件的引用和 returnAddress ,在編譯期間完成分配。
    堆區 , JAVA 堆,也稱 GC 堆,所有執行緒共享,存放物件的例項和陣列, JAVA 堆是垃圾收集器管理的主要區域。
    方法區 :所有執行緒共享,儲存已被虛擬機器載入的類資訊,常量,靜態變數,即時編譯器編譯後的程式碼等資料。這個區域的記憶體回收目標主要是針對常量池的物件的回收和對型別的解除安裝。
    程式計數器 :執行緒私有,每個執行緒都有自己獨立的程式計數器,用來指示下一條指令的地址
    第14天做過。
    6.下面哪個選項正確建立socket連線?
    A.Socket s = new Socket(8080);
    B.Socket s = new Socket(“192.168.1.1”,8080)
    C.SocketServer s = new Socket(8080);
    D.Socket s = new SocketServer(“192.168.1.1”,8080)
    正確答案: B 你的答案: B (正確)
    解析: 這個應該是答案的錯誤,埠號不能使用字串型別的;
    //建立Socket 客戶端物件
    Socket s = new Socket(“127.0.0.1”,6666);
    //建立ServerSocket 伺服器端物件。。
    ServerSocket ss = new ServerSocket(6666);
    //監聽伺服器連線
    s = ss.accept();
    7.下面有關JAVA swing的描述,說法錯誤的是?
    A.Swing是一個基於Java的跨平臺MVC框架。使用單執行緒模式。
    B.Swing 是為了解決 AWT 存在的問題而新開發的包,它以 AWT 為基礎的
    C.Swing優化了AWT,執行速度比AWT快
    D.Swing是一個基於元件的框架,所有的元件都是從javax.swing.JComponent類繼承來的
    正確答案: C 你的答案: B (錯誤)
    解析:Swing是一個用於開發Java應用程式使用者介面的開發工具包。它以抽象視窗工具包(AWT)為基礎使跨平臺應用程式可以使用任何可插拔的外觀風格。Swing開發人員只用很少的程式碼就可以利用Swing豐富、靈活的功能和模組化元件來建立優雅的使用者介面。
    工具包中所有的包都是以swing作為名稱,例如javax.swing,javax.swing.event
    用Swing建立圖形介面步驟:
    (1)匯入Swing包
    (2)選擇介面風格
    (3)設定頂層容器
    (4)設定按鈕和標籤
    (5)將元件放到容器上
    (6)為元件增加邊框
    (7)處理事件
    (8)輔助技術支援
    1。匯入Swing包
    下面語句匯入Swing包
    import javax.swing.*;

大部分Swing程式用到了AWT的基礎底層結構和事件模型,因此需要匯入兩個包:
import java.awt.;
import java.awt.event.
;

如果圖形介面中包括了事件處理,那麼還需要匯入事件處理包:
import javax.swing.event.*;
2.選擇介面風格
Swing允許選擇程式的圖形介面風格常用的有java風格,windows風格等
下面的程式碼用於選擇圖形介面風格,這裡選擇的是跨平臺的Java介面風格。
try { UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName( )); }
catch (Exception e) { }
(3) 設定頂層容器
圖形介面至少要有一個頂級Swing容器
頂級Swing容器為其它Swing元件在螢幕上的繪製和處理事件提供支援
常用的頂級容器:
JFrame(框架):表示主程式視窗
JDialog(對話方塊):每個JDialog物件表示一個對話方塊,對話方塊屬於二級視窗
JApplet(小程式):在瀏覽器內顯示一個小程式介面
一個框架包括邊界、選單欄、工具欄、狀態列,以及中間佔主要部分的窗格
窗格也可以看作是一種面板,但它是框架的一個組成部分
元件不會直接放到框架上,而是放在若干個面板上,這些面板再放到窗格上
用框架物件的getContentPane()函式來獲得窗格,再呼叫窗格的add()函式放置面板
public static void main(String[ ]args){JFrame frame=new JFrame(“SwingApplication”);
JPanel panel1=new JPanel();
frame.getContentPane().add(panel1,BorderLayout.CENTER);
…//新增其他元件
frame.pack();frame.setVisible(true);}
8.void waitForSignal()
{
Object obj = new Object();
synchronized(Thread.currentThread())
{
obj.wait();
obj.notify();
}
}
Which statement is true?
A.This code may throw an InterruptedException
B.This code may throw an IllegalStateException
C.This code may throw a TimeOutException after ten minutes
D.This code will not compile unless”obj.wait()”is replaced with”(Thread)obj).wait()”
E.Reversing the order of obj.wait()and obj.notify()may cause this method to complete normally
正確答案: A 你的答案: B (錯誤)
解析:
②wait() 與 notify/notifyAll() 的執行過程
由於 wait() 與 notify/notifyAll() 是放在同步程式碼塊中的,因此執行緒在執行它們時,肯定是進入了臨界區中的,即該執行緒肯定是獲得了鎖的。
當執行緒執行wait()時,會把當前的鎖釋放,然後讓出CPU,進入等待狀態。
當執行notify/notifyAll方法時,會喚醒一個處於等待該 物件鎖 的執行緒,然後繼續往下執行,直到執行完退出物件鎖鎖住的區域(synchronized修飾的程式碼塊)後再釋放鎖。
從這裡可以看出,notify/notifyAll()執行後,並不立即釋放鎖,而是要等到執行完臨界區中程式碼後,再釋放。故,在實際程式設計中,我們應該儘量線上程呼叫notify/notifyAll()後,立即退出臨界區。即不要在notify/notifyAll()後面再寫一些耗時的程式碼。
wait() 與 notify/notifyAll()都是放在同步程式碼塊中才能夠執行的。如果在執行wait() 與 notify/notifyAll() 之前沒有獲得相應的物件鎖,就會丟擲:java.lang.IllegalMonitorStateException異常。
9.針對以下程式碼,哪些選項執行後是true的:()
class CompareReference{
public static void main(String [] args){
float f=42.0f;
float f1[]=new float[2];
float f2[]=new float[2];
float[] f3=f1;
long x=42;
f1[0]=42.0f;
}
}
A.f1雙等於f2
B.x雙等於f1[0]
C.f1雙等於f3
D.f2雙等於f1[1]
正確答案: B C 你的答案: B C (正確)
解析: BC正確,選項B解釋,java核心卷I中43頁有如下表述:兩個數值進行二元操作時,會有如下的轉換操作:
如果兩個運算元其中有一個是double型別,另一個操作就會轉換為double型別。
否則,如果其中一個運算元是float型別,另一個將會轉換為float型別。
否則,如果其中一個運算元是long型別,另一個會轉換為long型別。
否則,兩個運算元都轉換為int型別。
故,x==f1[0]中,x將會轉換為float型別。
10.下面的類哪些可以處理Unicode字元?
A.InputStreamReader
B.BufferedReader
C.Writer
D.PipedInputStream
正確答案: A B C 你的答案: A B C (正確)
解析: 位元組流:
InputStream
|-- FileInputStream (基本檔案流)
|-- BufferedInputStream
|-- DataInputStream
|-- ObjectInputStream
字元流
Reader
|-- InputStreamReader (byte->char 橋樑)
|-- BufferedReader (常用)
Writer
|-- OutputStreamWriter (char->byte 橋樑)
|-- BufferedWriter
|-- PrintWriter (常用)