1. 程式人生 > >java基礎知識-面試(四)

java基礎知識-面試(四)

輸入輸出流

  • java.io.Serializable介面?
    java序列化:java提供了一種物件序列化的機制,該機制中,一個物件可以被表示為一個位元組序列(位元組流),將序列化物件寫入檔案,也可以從檔案中讀取出來,並且對它進行反序列化,物件的型別資訊,物件的資料還有物件資料型別可以用來在記憶體中新建物件

簡單來說:java中物件的序列化是指將一個java物件寫入IO流中,於此對應的是,物件的反序列化則從IO流中恢復該java物件

整個過程都是JVM獨立的,也就是說,在一個平臺上序列化的物件可以在另外一個完全不同的平臺上進行反序列化該物件

1.為什麼需要序列化?
物件檔案資料有很多不同的格式,很難統一傳輸和儲存,所以java就出了規範,用序列化來同一解決傳輸的問題,序列化以後就是位元組流了,無論原來是什麼東西,都能變成一樣的東西,就可以進行通用的資料格式的傳輸或者儲存,傳輸結束後,要想再次使用,就進行反序列化還原

在工作中用的比較多的就是:比如將記憶體中的類寫入檔案或者資料庫中, 在分散式系統中進行遠端呼叫時等等

如何實現可序列化:
類通過實現java.io.Serializable介面以啟用序列化功能,未實現此介面的類將無法使其任何狀態序列化胡總和反序列化
可序列化類所有子類本身都是可序列化的
序列化介面沒有方法或欄位,僅用於表示可序列化的語義

java中重要的類,ObjectInputStream和ObjectOutputStream是高層次的資料流,它們包含序列化和反序列化物件的方法

這裡寫圖片描述

這裡寫圖片描述

  • javaIO中有幾種型別的流
    一個流可以理解為一個數據的序列,輸入流表示從一個原讀取資料,輸出流表示是向一個目標寫資料
    位元組流:位元組輸入流InputStream 位元組輸出流:OutputStream
    字元流:字元輸入流:Reader 字元輸出流:Writer

這裡寫圖片描述

什麼時候用位元組流,什麼時候用字元流:
位元組流InputStream和OutputStream兩個是為位元組流設計的,主要用來處理位元組或二進位制物件
Reader和Writer兩個是為字元流(一個字元佔兩個位元組)設計的,主要用來處理字元或者字串

字元流處理的單元為2個位元組的Unicode字元,操作字元,字元陣列或字串
位元組流處理單元為1個位元組,操作位元組和位元組陣列
所以字元流是由java虛擬機器將字元轉化為2個位元組為單位的字元而承德
所以它對多國語言支援比較好

如果是音訊檔案、圖片、歌曲等,就用位元組流九號
如果是關係到中文的文字型別,用字元流就好

這裡寫圖片描述

位元組流和字元流的區別?
1.位元組流在操作室不會用到緩衝區,是直接對檔案本身進行操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案
2.磁碟上所有的檔案都是以位元組形式存在的,而字元值在記憶體中才會形成,真正儲存和傳輸資料時都是以位元組為單位的,字元只是存在於記憶體中,所以位元組流使用範圍更廣

  • Java中NIO和IO的主要區別?

IO和NIO的主要區別?
IO面向流,而NIO面向緩衝
IO是阻塞IO,NIO非阻塞IO
IO無選擇器,NIO有選擇器

  • *GC
    什麼是GC:
    GC就是垃圾回收機制(垃圾回收器),GC是JVM對記憶體實際上就是對物件進行管理的方式,

在C、C++中,釋放無用變數記憶體空間的事情要由程式設計師自己來解決,程式設計師要做的是應該實現所需的功能,而不是耗費大量精力在記憶體分配釋放的

Java有了GC,就不需要程式設計師人工去釋放記憶體空間,GC使得Java開發人員擺脫了一個繁瑣的記憶體管理工作,讓程式的開發更有效率

當java虛擬機器覺得記憶體資源緊張的時候,就會自動去清理無用變數佔用的記憶體空間,當然程式設計師可以在java程式中顯示地使用System.gc();或者Runtime.getRuntime().gc()來通知垃圾回收程式,至於垃圾回收程式運不運性,什麼時候執行,都是無法控制的

如果物件引用被置為null,垃圾收集器是否會立即釋放物件所佔的記憶體?
不會,在下一個垃圾回收週期中,這個物件將是可被回收的
是可被回收的, 並不是說下一個回收週期,一定要去回收,釋放針對的是一段已被使用的記憶體
回收是垃圾收集器的一個動作,結果就是釋放記憶體

  • java中的堆和棧介紹下

堆:(主要存放物件)
引用型別的變數,其記憶體分配在堆上或者常量池(字串常量、基本資料型別),需要通過new等方式來實現
堆記憶體主要作用於存放執行時建立的物件

主要用於存放物件,存取速度慢,可以執行時動態分配記憶體,生存期不需要提前確定

棧:(基本資料型別、物件的引用變數)
基本資料型別的變數,以及物件的引用變數,其記憶體分配到棧上,變量出了作用於就會被釋放

棧記憶體的主要作用是存放基本資料型別和引用變數,棧的記憶體管理是先進後出
主要用來執行程式,存取速度快,大小和生命週期必須確定,缺乏靈活性