Java基礎
下列哪個修飾符可以使在一個類中定義的成員變量只能被同一包中的類訪問?
- private
- 無修飾符
- public
- protected
無修飾符就是默認權限,也叫包訪問權限,只能被同一包內類訪問
名稱 | 說明 | 備注 |
---|---|---|
public | 可以被任何類訪問 | |
private | 只能夠被當前類的方法訪問 | |
protected | 可以被同一包中的所有類訪問 可以被所有子類訪問 | 子類沒有在同一包中也可以訪問 |
缺省 無訪問修飾符 |
可以被同一包中的所有類訪問 | 如果子類沒有在同一個包中,也不能訪問 |
下面有關servlet和cgi的描述,說法錯誤的是?
- servlet處於服務器進程中,它通過多線程方式運行其service方法
- CGI對每個請求都產生新的進程,服務完成后就銷毀
- servlet在易用性上強於cgi,它提供了大量的實用工具例程,例如自動地解析和解碼HTML表單數據、讀取和設置HTTP頭、處理Cookie、跟蹤會話狀態等
- cgi在移植性上高於servlet,幾乎所有的主流服務器都直接或通過插件支持cgi
CGI不可移植,為某一特定平台編寫的CGI應用只能運行於這一環境中。每一個CGI應用存在於一個由客戶端請求激活的進程中,並且在請求被服務后被卸載。這種模式將引起很高的內存、CPU開銷,而且在同一進程中不能服務多個客戶。
以下關於對象序列化描述正確的是
- 使用FileOutputStream可以將對象進行傳輸
- 使用PrintWriter可以將對象進行傳輸
- 使用transient修飾的變量不會被序列化
- 對象序列化的所屬類需要實現Serializable接口
使用ObjectOutputStream和ObjectInputStream可以將對象進行傳輸.
聲明為static和transient類型的成員數據不能被串行化。因為static代表類的狀態, transient代表對象的臨時數據。
下面哪些描述是正確的
public class Test {
public static class A {
private B ref;
public void setB(B b) {
ref = b;
}
}
public static Class B {
private A ref;
public void setA(A a) {
ref = a;
}
}
public static void main(String args[]) {
…
start();
…
}
public static void start() {
A a = new A();
B b = new B();
a.setB(b);
b = null;
a = null;
…
}
}
- b = null執行后b可以被垃圾回收
- a = null執行后b可以被垃圾回收
- a = null執行后a可以被垃圾回收
- a,b必須在整個程序結束后才能被垃圾回收
- 類A和類B在設計上有循環引用,會導致內存泄露
- a, b 必須在start方法執行完畢才能被垃圾回收
其實是一個找GC Root的過程
下面關於面向對象的一些理解哪些是錯誤的
- 面向對象的最重要的特性是支持繼承、封裝和多態
- 系統設計應該遵循開閉原則,系統應該穩定不不可修改,但應支持通過繼承、組合等方式進行擴展
- 函數式的語言必然是面向對象的語言
- 面向對象設計時,每個類的職責應該單一,不要再一個類中引入過多的接口
- 過程式語言和面向對象的語言各有其優勢,過程式語言更加靈活,面向對象語言更加強調抽象和封裝
- Java和C++都是靜態類型的面向對象編程語言
C語言不是面向對象,但是函數式; Java和C++都是靜態類型的面向對象編程語言
下列哪些方法是針對循環優化進行的
- 強度削弱
- 刪除歸納變量
- 刪除多余運算
- 代碼外提
常見的代碼優化技術有:復寫傳播,刪除死代碼,強度削弱,歸納變量刪除,代碼外提
下列說法正確的是
- java中包的主要作用是實現跨平台功能
- package語句只能放在import語句后面
- 包(package)由一組類(class)和接口(interface)組成
- 可以用#include關鍵詞來標明來自其它包中的類
A:java中"包"的引入的主要原因是java本身跨平台特性的需求。實現跨平台的是JVM。
B:package語句是Java源文件的第一條語句。(若缺省該語句,則指定為無名包。),如果想在另一個類里面引用包里面的類,要把名字寫全。(相當用文件的絕對路徑訪問)或者用import導入。
D:java中並無#include關鍵字, 如果想在另一個類里面引用包里面的類,要把名字寫全。(相當用文件的絕對路徑訪問)或者用import導入。
關於 Socket 通信編程,以下描述錯誤的是
- 服務器端通過new ServerSocket()創建TCP連接對象
- 服務器端通過TCP連接對象調用accept()方法創建通信的Socket對象
- 客戶端通過new Socket()方法創建通信的Socket對象
- 客戶端通過new ServerSocket()創建TCP連接對象
**Socket套接字 **
就是源Ip地址,目標IP地址,源端口號和目標端口號的組合
服務器端:ServerSocket提供的實例
ServerSocket server= new ServerSocket(端口號)
客戶端:Socket提供的實例
Socket soc=new Socket(ip地址,端口號)
在jdk1.5之后,下列 java 程序輸出結果為______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
- true,false
- true,true
- false,true
- false,false
- 對於不同的環境結果不同
- 程序無法執行
本題是一個自動拆裝箱的考題(自動拆裝箱JDK需在1.5上),下面的討論都不針對新開辟對象的情況:
1、基本型和基本型封裝型進行“ == ”運算符的比較,基本型封裝型將會自動拆箱變為基本型后再進行比較,因此Integer(0)會自動拆箱為int類型再進行比較,顯然返回true;
2、兩個Integer類型進行“ == ”比較,如果其值在-128至127,那么返回true,否則返回false, 這跟Integer.valueOf()的緩沖對象有關,這里不進行贅述。
3、兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
4、基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱,基本型轉換為其封裝類型,再進行3中的比較。
運用下列哪個命令能夠獲取JVM的內存映像
- jinfo
- jmap
- jhat
- jstat
1、jps:查看本機java進程信息。
2、jstack:打印線程的棧信息,制作線程dump文件。
3、jmap:打印內存映射,制作堆dump文件
4、jstat:性能監控工具
5、jhat:內存分析工具
6、jconsole:簡易的可視化控制台
7、jvisualvm:功能強大的控制台
計算機網絡
一IP地址為(201.222.5.121),子網掩碼為(255.255.255.248),求網絡地址,廣播地址,IP范圍
IP:201.222.5.121 (01111001)
掩碼:255.255.255.248(11111000)
與得:201.222.5.120 為網絡地址
則:201.222.5.127 (01111111,主機位全1)為廣播地址
IP范圍:201.222.5.121--------201.222.5.126
現需要將一個網絡划分為5個子網,每個子網至少有16個主機。則應該使用下列哪一個子網掩碼?
- 255.255.255.192
- 255.255.255.224
- 255.255.255.240
- 255.255.255.248
至少需要log2(16)=4個二進制位才能在同一個網絡中區分出16個主機。而IPv4中全0代表網絡號,因此全0地址不能用於表示主機地址,所以至少需要5個二進制位。因此32位子網掩碼最后8位應該是(1110 0000),換成十進制是224。
主機數量=2^n-2,其中n是主機號位數。
子網數=2^n,其中n是子網號位數。
主機數 = 256-子網掩碼-2
數據結構與算法
優先級隊列被實現為最大堆。最初它有5個元素,堆的層次遍歷是10,8,5,3,2。現按照順序將兩個新元素1和7插入到堆中。則插入新元素后,堆的層次遍歷結果是什么?
- 10, 8, 7, 3, 2, 1, 5
- 10, 8, 7, 1, 2, 3, 5
- 10, 8, 7, 2, 3, 1, 5
- 10, 8, 7, 5, 3, 2, 1
最大堆層次遍歷:10,8,5,3,2
10
/ \
8 5
/ \
3 2
插入1
10
/ \
8 5
/ \ /
3 2 1
插入7
10
/ \
8 5
/ \ / \
3 2 1 7
變換
10
/ \
8 7
/ \ / \
3 2 1 5