高階特性複習題
1. 基本資料型別和包裝類
1)八個基本資料型別的包裝類
基本資料型別 包裝類
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double
2)為什麼為基本型別引入包裝類
基本資料型別有方便之處,簡單、高效。
但是Java中的基本資料型別卻是不面向物件的(沒有屬性、方法),這在實際使用時存在很多的不便(比如集合的元素只能是Object)。
為了解決這個不足,在設計類時為每個基本資料型別設計了一個對應的類進行包裝,這樣八個和基本資料型別對應的類統稱為包裝類(Wrapper Class)。
3) 包裝類和基本資料型別之間的轉換
包裝類------ wrapperInstance.xxxValue() ----------->基本資料型別
包裝類<-----new WrapperClass(primitive) new WrapperClass(string)------基本資料型別
4)自動裝箱和自動拆箱
JDK1.5提供了自動裝箱(autoboxing)和自動拆箱(autounboxing)功能, 從而實現了包裝類和基本資料型別之間的自動轉換
5)、包裝類還可以實現基本型別變數和字串之間的轉換
基本型別變數------------String.valueof()------------>字串
基本型別變數<------------WrapperClass.parseXxx(string)------------字串
2、Integer與int的區別
int是java提供的8種原始資料型別之一。Java為每個原始型別提供了封裝類,Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null,即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer。在JSP開發中,Integer的預設為null,所以用el表示式在文字框中顯示時,值為空白字串,而int預設的預設值為0,所以用el表示式在文字框中顯示時,結果為0,所以,int不適合作為web層的表單資料的型別。
在Hibernate中,如果將OID定義為Integer型別,那麼Hibernate就可以根據其值是否為null而判斷一個物件是否是臨時的,如果將OID定義為了int型別,還需要在hbm對映檔案中設定其unsaved-value屬性為0。
另外,Integer提供了多個與整數相關的操作方法,例如,將一個字串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。
3. Java集合體繫結構(List、Set、Collection、Map的區別和聯絡)
Collection 介面儲存一組不唯一,無序的物件
List 介面儲存一組不唯一,有序(插入順序)的物件
Set 介面儲存一組唯一,無序的物件
Map介面儲存一組鍵值物件,提供key到value的對映。Key無序,唯一。value不要求有序,允許重複。(如果只使用key儲存,而不使用value,那就是Set)
4. Vector和ArrayList、ArrayList和LinkedList的區別和聯絡
Vector和ArrayList的區別和聯絡
實現原理相同,功能相同,都是長度可變的陣列結構,很多情況下可以互用
兩者的主要區別如下
- Vector是早期JDK介面,ArrayList是替代Vector的新介面
- Vector執行緒安全,ArrayList重速度輕安全,執行緒非安全
- 長度需增長時,Vector預設增長一倍,ArrayList增長50%
ArrayList和LinkedList的區別和聯絡
ArrayList實現了長度可變的陣列,在記憶體中分配連續空間。遍歷元素和隨機訪問元素的效率比較高;
LinkedList採用連結串列儲存方式。插入、刪除元素時效率比較高
5. HashMap和Hashtable的區別和聯絡
實現原理相同,功能相同,底層都是雜湊表結構,查詢速度快,在很多情況下可以互用
兩者的主要區別如下
- Hashtable是早期JDK提供的介面,HashMap是新版JDK提供的介面
- Hashtable繼承Dictionary類,HashMap實現Map介面
- Hashtable執行緒安全,HashMap執行緒非安全
- Hashtable不允許null值,HashMap允許null值
6. HashSet的使用和原理(hashCode()和equals())
1) 雜湊表的查詢速度特別快,時間複雜度為O(1)。
2) HashMap、Hashtable、HashSet這些集合採用的是雜湊表結構,需要用到hashCode雜湊碼,hashCode是一個整數值。
3) 系統類已經覆蓋了hashCode方法 自定義類如果要放入hash類集合,必須重寫hashcode。如果不重寫,呼叫的是Object的hashcode,而Object的hashCode實際上是地址。
4) 向雜湊表中新增資料的原理:當向集合Set中增加物件時,首先集合計算要增加物件的hashCode碼,根據該值來得到一個位置用來存放當前物件,如在該位置沒有一個物件存在的話,那麼集合Set認為該物件在集合中不存在,直接增加進去。如果在該位置有一個物件存在的話,接著將準備增加到集合中的物件與該位置上的物件進行equals方法比較,如果該equals方法返回false,那麼集合認為集合中不存在該物件,在進行一次雜湊,將該物件放到雜湊後計算出的新地址裡。如果equals方法返回true,那麼集合認為集合中已經存在該物件了,不會再將該物件增加到集合中了。
5) 在雜湊表中判斷兩個元素是否重複要使用到hashCode()和equals()。hashCode決定資料在表中的儲存位置,而equals判斷是否存在相同資料。
6) Y=K(X) :K是函式,X是雜湊碼,Y是地址
7. TreeSet的原理和使用(Comparable和comparator)
1、TreeSet中的元素不允許重複,但是有序
2、TreeSet採用樹結構儲存資料,存入元素時需要和樹中元素進行對比,需要指定比較策略。可以通過Comparable和Comparator來指定比較策略。
3、實現了Comparable的系統類可以順利存入TreeSet。自定義類可以實現Comparable介面來指定比較策略。
4、可建立Comparator介面實現類來指定比較策略,並通過TreeSet構造方法引數傳入。這種方式尤其對系統類非常適用。
8. 集合和陣列的比較(為什麼引入集合)
陣列不是面向物件的,存在明顯的缺陷,集合完全彌補了陣列的一些缺點,比陣列更靈活更實用,可大大提高軟體的開發效率而且不同的集合框架類可適用於不同場合。具體如下:
1:陣列的效率高於集合類.
2:陣列能存放基本資料型別和物件,而集合類中只能放物件。
3: 陣列容量固定且無法動態改變,集合類容量動態改變。
4:陣列無法判斷其中實際存有多少元素,length只告訴了array的容量。
5:集合有多種實現方式和不同的適用場合,而不像陣列僅採用順序表方式。
6:集合以類的形式存在,具有封裝、繼承、多型等類的特性,通過簡單的方法和屬性呼叫即可實現各種複雜操作,大大提高軟體的開發效率。
9. Collection和Collections的區別
Collection是Java提供的集合介面,儲存一組不唯一,無序的物件。它有兩個子介面List和Set。
Java中還有一個Collections類,專門用來操作集合類 ,它提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。
10.程序和執行緒有什麼聯絡和區別?
1.定義:
1) 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程的一個獨立單位。
2) 執行緒是程序的一個實體,是CPU排程和分派的基本單位,他是比程序更小的能獨立執行的基本單位,執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),一個執行緒可以建立和撤銷另一個執行緒;
2.程序和執行緒的關係:
(1)一個執行緒只能屬於一個程序,而一個程序可以有多個執行緒,但至少有一個執行緒。
(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。
(3)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。
(4)處理機分給執行緒,即真正在處理機上執行的是執行緒。
(5)執行緒是指程序內的一個執行單元,也是程序內的可排程實體。
3.執行緒與程序的區別:
(1)排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位。
(2)併發性:不僅程序之間可以併發執行,同一個程序的多個執行緒之間也可以併發執行。
(3)擁有資源:程序是擁有資源的一個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序的資源。
(4)系統開銷:在建立或撤銷程序的時候,由於系統都要為之分配和回收資源,導致系統的明顯大於建立或撤銷執行緒時的開銷。但程序有獨立的地址空間,程序崩潰後,在保護模式下不會對其他的程序產生影響,而執行緒只是一個程序中的不同的執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但是在程序切換時,耗費的資源較大,效率要差些
11.建立執行緒的兩種方式分別是什麼?
方式1:繼承Java.lang.Thread類,並覆蓋run() 方法。優勢:編寫簡單;劣勢:無法繼承其它父類
public class ThreadDemo1 {
public static void main(String args[]) {
MyThread1 t = new MyThread1();
t.start();
while (true) {
System.out.println("兔子領先了,別驕傲");
}
}
}
class MyThread1 extends Thread {
public void run() {
while (true) {
System.out.println("烏龜領先了,加油");
}
}
}
方式2:實現Java.lang.Runnable介面,並實現run()方法。優勢:可繼承其它類,多執行緒可共享同一個Thread物件;劣勢:程式設計方式稍微複雜,如需訪問當前執行緒,需呼叫Thread.currentThread()方法
public class ThreadDemo2 {
public static void main(String args[]) {
MyThread2 mt = new MyThread2();
Thread t = new Thread(mt);
t.start();
while (true) {
System.out.println("兔子領先了,加油");
}
}
}
class MyThread2 implements Runnable {
public void run() {
while (true) {
System.out.println("烏龜超過了,再接再厲");
}
}
}
12.如何實現執行緒同步?
當多個執行緒訪問同一個資料時,容易出現執行緒安全問題,需要某種方式來確保資源在某一時刻只被一個執行緒使用。需要讓執行緒同步,保證資料安全
執行緒同步的實現方案:同步程式碼塊和同步方法,均需要使用synchronized關鍵字
同步程式碼塊:public void makeWithdrawal(int amt) {
synchronized (acct) { }
}
同步方法:public synchronized void makeWithdrawal(int amt) { }
執行緒同步的好處:解決了執行緒安全問題
執行緒同步的缺點:效能下降,可能會帶來死鎖
13. Java中實現執行緒通訊的三個方法的作用是什麼?
Java提供了3個方法解決執行緒之間的通訊問題,均是java.lang.Object類的方法,都只能在同步方法或者同步程式碼塊中使用,否則會丟擲異常。
方法名 |
作 用 |
final void wait() |
表示執行緒一直等待,直到其它執行緒通知 |
void wait(long timeout) |
執行緒等待指定毫秒引數的時間 |
final void wait(long timeout,int nanos) |
執行緒等待指定毫秒、微妙的時間 |
final void notify() |
喚醒一個處於等待狀態的執行緒。注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。 |
final void notifyAll() |
喚醒同一個物件上所有呼叫wait()方法的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭 |
14.什麼是java序列化,如何實現java序列化?
我們有時候將一個java物件變成位元組流的形式傳出去或者從一個位元組流中恢復成一個java物件,例如,要將java物件儲存到硬碟或者傳送給網路上的其他計算機,這個過程我們可以自己寫程式碼去把一個java物件變成某個格式的位元組流再傳輸,但是,jre本身就提供了這種支援,我們可以呼叫OutputStream的writeObject方法來做,如果要讓java 幫我們做,要被傳輸的物件必須實現serializable介面,這樣,javac編譯時就會進行特殊處理,編譯的類才可以被writeObject方法操作,這就是所謂的序列化。需要被序列化的類必須實現Serializable介面,該介面是一個mini介面,其中沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的。
例如,在web開發中,如果物件被儲存在了Session中,tomcat在重啟時要把Session物件序列化到硬碟,這個物件就必須實現Serializable介面。如果物件要經過分散式系統進行網路傳輸或通過rmi等遠端呼叫,這就需要在網路上傳輸物件,被傳輸的物件就必須實現Serializable介面。
15.介紹OSI七層模型和TCP/IP模型
- OSI(Open System Interconnection),開放式系統互聯參考模型 。是一個邏輯上的定義,一個規範,它把網路協議從邏輯上分為了7層。每一層都有相關、相對應的物理裝置,比如常規的路由器是三層交換裝置,常規的交換機是二層交換裝置。OSI七層模型是一種框架性的設計方法,建立七層模型的主要目的是為解決異種網路互連時所遇到的相容性問題,其最主要的功能就是幫助不同型別的主機實現資料傳輸。它的最大優點是將服務、介面和協議這三個概念明確地區分開來,通過七個層次化的結構模型使不同的系統不同的網路之間實現可靠的通訊。
- TCP/IP協議是Internet最基本的協議、Internet國際網際網路絡的基礎,主要由網路層的IP協議和傳輸層的TCP協議組成。TCP/IP 定義了電子裝置如何連入因特網,以及資料如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。
- ISO制定的OSI參考模型的過於龐大、複雜招致了許多批評。伴隨著網際網路的流行,其本身所採用的TCP/IP協議棧獲得了更為廣泛的應用和認可。在TCP/IP參考模型中,去掉了OSI參考模型中的會話層和表示層(這兩層的功能被合併到應用層實現)。同時將OSI參考模型中的資料鏈路層和物理層合併為主機到網路層。
16. TCP協議和UDP協議的比較
TCP和UDP是TCP/IP協議棧中傳輸層的兩個協議,它們使用IP路由功能把資料包傳送到目的地,從而為應用程式及應用層協議(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供網路服務。TCP傳輸原理類似電話通訊系統,而UDP傳輸原理類似電報通訊系統。具體區別如下:
- TCP是面向連線的傳輸。UDP是無連線的傳輸
- TCP有流量控制、擁塞控制,檢驗資料資料按序到達,而UDP則相反。
- TCP的路由選擇只發生在建立連線的時候,而UDP的每個報文都要進行路由選擇
- TCP是可靠性傳輸,他的可靠性是由超時重發機制實現的,而UDP則是不可靠傳輸
- UDP因為少了很多控制資訊,所以傳輸速度比TCP速度快
- TCP適合用於傳輸大量資料,UDP適合用於傳輸小量資料
17.什麼是Socket程式設計;簡述基於TCP協議的Socket程式設計的主要步驟
什麼是Socket程式設計
所謂socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。應用程式通常通過"套接字"向網路發出請求或者應答網路請求。
Socket套接字用於在主機和Internet之間建立可靠的、雙向的、持續的、點對點的流式連線。一個套接字可以用來建立Java的輸入輸出系統到其他的駐留在本地機或Internet上的任何機器的程式的連線。應用程式通過Socket向網路發出請求或者應答網路請求,Socket隱藏了資料流傳輸中的複雜性。
可以把Socket比作是一個港口碼頭,應用程式只要將資料交給Socket,就算完成了資料的傳送,具體細節由Socket來完成,細節不必瞭解。同理,對於接收方,應用程式也要建立一個碼頭,等待資料的到達,並獲取資料。
Java分別為TCP和UDP 兩種通訊協議提供了相應的Socket程式設計類,這些類存放在java.net包中,與TCP對應的是伺服器的ServerSocket和客戶端的Socket,與UDP對應的是DatagramSocket。
基於TCP協議的Socket程式設計的主要步驟