1.IO流
Java中有幾種類型的流
答:字節(jié)流奴拦,字符流兰怠。字節(jié)流繼承于InputStream畦攘、OutputStream霸妹,字符流繼承于InputStreamReader、OutputStreamWriter知押。在java.io包中還有許多其他的流叹螟,主要是為了提高性能和使用方便。
File類型中定義了什么方法來創(chuàng)建一級目錄台盯?File類型中定義了什么方法來判斷一個文件是否存在罢绽?
答:mkdirs() ,在指定位置創(chuàng)建目錄静盅,這會創(chuàng)建路徑中所有不存在的目錄良价。exists(),文件或文件夾是否存在蒿叠。
為了提高讀寫性能明垢,可以采用什么流?
答:緩沖流(BufferedInputStream市咽、BufferedOutputStream)
對文本文件操作用什么I/O流痊银?
答:FileReader、FileWriter
對各種基本數(shù)據(jù)類型和String類型的讀寫施绎,采用什么流曼验?
答:DataInputStream、DataOutputStream
2.其他
如何實現(xiàn)對象克抡辰鬓照?深拷貝和淺拷貝區(qū)別?
答:那么孤紧,如果一個對象需要被克隆豺裆,那么該如何實現(xiàn)呢?分成如下兩步:
1)實現(xiàn)Cloneable接口
2)復(fù)寫Object類中的clone()方法
如何區(qū)分深拷貝與淺拷貝,簡單點來說臭猜,就是假設(shè)B復(fù)制了A躺酒,當(dāng)修改A時,看B是否會發(fā)生變化蔑歌,如果B也跟著變了羹应,說明這是淺拷貝,拿人手短次屠,如果B沒變园匹,那就是深拷貝,自食其力劫灶。
什么是比特(Bit),什么是字節(jié)(Byte),什么是字符(Char),它們長度是多少,各有什么區(qū)別裸违?
答:1. Bit最小的二進(jìn)制單位 ,是計算機的操作部分 取值0或者1?
2. Byte是計算機操作數(shù)據(jù)的最小單位由8位bit組成 取值(-128-127)?
3. Char是用戶的可讀寫的最小單位本昏,在java里面由16位bit組成 取值(0-65535)
什么是同步IO供汛?什么是異步IO?什么是阻塞IO涌穆?什么是非阻塞IO怔昨?
答:所謂同步,就是在發(fā)出一個功能調(diào)用時宿稀,在沒有得到結(jié)果之前趁舀,該調(diào)用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事原叮。
例如普通B/S模式(同步):提交請求->等待服務(wù)器處理->處理完畢返回?這個期間客戶端瀏覽器不能干任何事
異步的概念和同步相對。當(dāng)一個異步過程調(diào)用發(fā)出后巡蘸,調(diào)用者不能立刻得到結(jié)果奋隶。實際處理這個調(diào)用的部件在完成后,通過狀態(tài)悦荒、通知和回調(diào)來通知調(diào)用者唯欣。
例如 ajax請求(異步):?請求通過事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起(線程進(jìn)入非可執(zhí)行狀態(tài)搬味,在這個狀態(tài)下境氢,cpu不會給線程分配時間片,即線程暫停運行)碰纬。函數(shù)只有在得到結(jié)果之后才會返回萍聊。
有人也許會把阻塞調(diào)用和同步調(diào)用等同起來,實際上他是不同的悦析。對于同步調(diào)用來說寿桨,很多時候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒有返回,它還會搶占cpu去執(zhí)行其他邏輯强戴,也會主動檢測io是否準(zhǔn)備好亭螟。
非阻塞和阻塞的概念相對應(yīng)挡鞍,指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當(dāng)前線程预烙,而會立刻返回墨微。
再簡單點理解就是:
1. 同步,就是我調(diào)用一個功能扁掸,該功能沒有結(jié)束前翘县,我死等結(jié)果。
2. 異步也糊,就是我調(diào)用一個功能炼蹦,不需要知道該功能結(jié)果,該功能有結(jié)果后通知我(回調(diào)通知)
3. 阻塞狸剃,就是調(diào)用我(函數(shù))掐隐,我(函數(shù))沒有接收完數(shù)據(jù)或者沒有得到結(jié)果之前,我不會返回钞馁。
4. 非阻塞虑省,就是調(diào)用我(函數(shù)),我(函數(shù))立即返回僧凰,通過select通知調(diào)用者
同步IO和異步IO的區(qū)別就在于:數(shù)據(jù)拷貝的時候進(jìn)程是否阻塞
阻塞IO和非阻塞IO的區(qū)別就在于:應(yīng)用程序的調(diào)用是否立即返回
什么是java序列化探颈,如何實現(xiàn)java序列化?
答:我們有時候?qū)⒁粋€java對象變成字節(jié)流的形式傳出去或者從一個字節(jié)流中恢復(fù)成一個java對象训措,例如伪节,要將java對象存儲到硬盤或者傳送給網(wǎng)絡(luò)上的其他計算機,這個過程我們可以自己寫代碼去把一個java對象變成某個格式的字節(jié)流再傳輸绩鸣,但是怀大,jre本身就提供了這種支持,我們可以調(diào)用OutputStream的writeObject方法來做呀闻,如果要讓java 幫我們做化借,要被傳輸?shù)膶ο蟊仨殞崿F(xiàn)serializable接口,這樣捡多,javac編譯時就會進(jìn)行特殊處理蓖康,編譯的類才可以被writeObject方法操作,這就是所謂的序列化垒手。需要被序列化的類必須實現(xiàn)Serializable接口蒜焊,該接口是一個mini接口,其中沒有需要實現(xiàn)的方法科贬,implements Serializable只是為了標(biāo)注該對象是可被序列化的山涡。
例如,在web開發(fā)中,如果對象被保存在了Session中鸭丛,tomcat在重啟時要把Session對象序列化到硬盤竞穷,這個對象就必須實現(xiàn)Serializable接口。如果對象要經(jīng)過分布式系統(tǒng)進(jìn)行網(wǎng)絡(luò)傳輸或通過rmi等遠(yuǎn)程調(diào)用鳞溉,這就需要在網(wǎng)絡(luò)上傳輸對象瘾带,被傳輸?shù)膶ο缶捅仨殞崿F(xiàn)Serializable接口。