1)八個基本數據類型的包裝類java
基本數據類型 包裝類web
byte Byte編程
boolean Boolean數組
short Shorttomcat
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)------------字符串
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中還定義了表示整數的最大值和最小值的常量。
Collection 接口存儲一組不惟一,無序的對象
List 接口存儲一組不惟一,有序(插入順序)的對象
Set 接口存儲一組惟一,無序的對象
Map接口存儲一組鍵值對象,提供key到value的映射。Key無序,惟一。value不要求有序,容許重複。(若是隻使用key存儲,而不使用value,那就是Set)
Vector和ArrayList的區別和聯繫
實現原理相同,功能相同,都是長度可變的數組結構,不少狀況下能夠互用
二者的主要區別以下
ArrayList和LinkedList的區別和聯繫
ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素的效率比較高;
LinkedList採用鏈表存儲方式。插入、刪除元素時效率比較高
實現原理相同,功能相同,底層都是哈希表結構,查詢速度快,在不少狀況下能夠互用
二者的主要區別以下
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是地址
一、TreeSet中的元素不容許重複,可是有序
二、TreeSet採用樹結構存儲數據,存入元素時須要和樹中元素進行對比,須要指定比較策略。能夠經過Comparable和Comparator來指定比較策略。
三、實現了Comparable的系統類能夠順利存入TreeSet。自定義類能夠實現Comparable接口來指定比較策略。
四、可建立Comparator接口實現類來指定比較策略,並經過TreeSet構造方法參數傳入。這種方式尤爲對系統類很是適用。
數組不是面向對象的,存在明顯的缺陷,集合徹底彌補了數組的一些缺點,比數組更靈活更實用,可大大提升軟件的開發效率並且不一樣的集合框架類可適用於不一樣場合。具體以下:
1:數組的效率高於集合類.
2:數組能存放基本數據類型和對象,而集合類中只能放對象。
3: 數組容量固定且沒法動態改變,集合類容量動態改變。
4:數組沒法判斷其中實際存有多少元素,length只告訴了array的容量。
5:集合有多種實現方式和不一樣的適用場合,而不像數組僅採用順序表方式。
6:集合以類的形式存在,具備封裝、繼承、多態等類的特性,經過簡單的方法和屬性調用便可實現各類複雜操做,大大提升軟件的開發效率。
Collection是Java提供的集合接口,存儲一組不惟一,無序的對象。它有兩個子接口List和Set。
Java中還有一個Collections類,專門用來操做集合類 ,它提供一系列靜態方法實現對各類集合的搜索、排序、線程安全化等操做。
1.定義:
1) 進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。
2) 線程是進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),一個線程能夠建立和撤銷另外一個線程;
2.進程和線程的關係:
(1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程。
(2)資源分配給進程,同一進程的全部線程共享該進程的全部資源。
(3)線程在執行過程當中,須要協做同步。不一樣進程的線程間要利用消息通訊的辦法實現同步。
(4)處理機分給線程,即真正在處理機上運行的是線程。
(5)線程是指進程內的一個執行單元,也是進程內的可調度實體。
3.線程與進程的區別:
(1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位。
(2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也能夠併發執行。
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源。
(4)系統開銷:在建立或撤銷進程的時候,因爲系統都要爲之分配和回收資源,致使系統的明顯大於建立或撤銷線程時的開銷。但進程有獨立的地址空間,進程崩潰後,在保護模式下不會對其餘的進程產生影響,而線程只是一個進程中的不一樣的執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,可是在進程切換時,耗費的資源較大,效率要差些
方式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("烏龜超過了,再接再礪");
}
}
}
當多個線程訪問同一個數據時,容易出現線程安全問題,須要某種方式來確保資源在某一時刻只被一個線程使用。須要讓線程同步,保證數據安全
線程同步的實現方案:同步代碼塊和同步方法,均須要使用synchronized關鍵字
同步代碼塊:public void makeWithdrawal(int amt) {
synchronized (acct) { }
}
同步方法:public synchronized void makeWithdrawal(int amt) { }
線程同步的好處:解決了線程安全問題
線程同步的缺點:性能降低,可能會帶來死鎖
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()方法的線程,注意並非給全部喚醒線程一個對象的鎖,而是讓它們競爭 |
咱們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其餘計算機,這個過程咱們能夠本身寫代碼去把一個java對象變成某個格式的字節流再傳輸,可是,jre自己就提供了這種支持,咱們能夠調用OutputStream的writeObject方法來作,若是要讓java 幫咱們作,要被傳輸的對象必須實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才能夠被writeObject方法操做,這就是所謂的序列化。須要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有須要實現的方法,implements Serializable只是爲了標註該對象是可被序列化的。
例如,在web開發中,若是對象被保存在了Session中,tomcat在重啓時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。若是對象要通過分佈式系統進行網絡傳輸或經過rmi等遠程調用,這就須要在網絡上傳輸對象,被傳輸的對象就必須實現Serializable接口。
TCP和UDP是TCP/IP協議棧中傳輸層的兩個協議,它們使用IP路由功能把數據包發送到目的地,從而爲應用程序及應用層協議(包括:HTTP、SMTP、SNMP、FTP和Telnet)提供網絡服務。TCP傳輸原理相似電話通訊系統,而UDP傳輸原理相似電報通訊系統。具體區別以下:
什麼是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編程的主要步驟