java面試(基礎篇)
1、JDK和JRE的區別以及跨平臺的原理
JRE:java的原型環境,包括java虛擬機器和java程式所需的核心類庫,JVM+類庫
JDK:java的開發工具包,包含java的開發工具,編譯工具、打包工具等
JDK=JRE+Java的開發工具
跨平臺的原理:實現跨平臺需要依賴jva的虛擬機器jVM,不同平臺使用不同的java虛擬機器,實現一次編譯處處執行
2、java的關鍵字和識別符號及其特點
java關鍵字:被java語言賦予特定含義的單詞
特點:組成關鍵字的字母全部小寫,常見的程式碼編輯器對關鍵會有特殊的顏色標記
識別符號:給類、方法、變數等起名字
特點:由字元、下劃線、美元符$組成,不能以數字開頭、不能是java的關鍵字
3、java的資料型別和分類
分類:
基本資料型別:四類八種
引用資料型別:類、介面、陣列
4、java的運算子種類
4.1、算術運算子
對常量和變數進行操作的運算子
字元參與運算:其實就是該字元對應的數值操作
字串和其它資料型別的陣列做拼接,結果是字串型別
4.2、賦值運算子
4.3、關係運算符
關係運算符的結果都是boolean性,要麼是true要麼是false
4.4、邏輯運算子
4.5、三元運算子
5、&&和&的區別以及|和||的區別:
&&和&的區別
&&和&都是邏輯與運算,都是要求運算子兩側的表示式為true,結果才為true。&& 具有短路效果,當左側的表示式結果為false時,右側將不再執行。&是無論左側是 否為false,將繼續執行下去。&還可以用於按位與
|和||的區別
最終的結果是一樣的,||具有短路效果,左側為true,右邊將不再執行,|是無論 左邊是false還是true,右邊都會執行
6、鍵盤錄入的物件建立
Scannersc = new Scanner(System.in);
再呼叫sc.nextInt()的等函式
7、陣列
陣列是儲存同一種資料型別多個元素的容器
兩種初始化方式:
初始化:就是為陣列中的陣列元素分配記憶體空間,併為每個陣列元素賦值
動態初始化:初始化時只指定陣列長度、並有系統為陣列分配初始化值
靜態初始化:初始化指定每個陣列元素的初始化值,有系統決定陣列長度
8、JVM的記憶體劃分
棧:儲存區域性變數
堆:儲存new出來的東西
方法區:
本地方法區:與系統相關
暫存器:給CPU使用
9、方法過載和方法重寫
方法過載:在同一個類中,允許多個同名方法,只要他們的引數個數或者引數型別不同即可,方法名相同,引數型別不同,分為引數個數不同,引數型別不同,與返回值無關
方法重寫:存在於子父類之間,子類的方法的許可權修飾符許可權大於或等於父類的,方法名和引數型別完全相同,與返回值有關
10、方法中的引數傳遞
形參為基本資料型別:形參的改變不影響實際引數
形參為引用資料型別:形參的改變會影響實際引數
11、面向物件的特徵
1、封裝
將客觀事物封裝成抽象的類,一個類就是一個封裝了資料和操作的這些資料的程式碼 的邏輯實體
2、繼承
可以讓其他型別的得物件獲得另一個型別的物件的屬性的方法。它可以使用 現有類的所有功能,並在無需重寫原來類的情況下對這些功能進行擴充套件
3、多型
父類或父介面引用指向的子類物件
12、面向物件的特點
更符合我們的思考方式,將事情將給其他人去做,將複雜事情簡單化,我們從執行者變 成了指揮者角色
13、類與物件的關係
類:是一組相關屬性和行為的集合
物件:是該類事物的具體體現
14、String、StringBuffer、StringBuilder
String:字串常量,字串長度不變,是被宣告程final的,一次賦值不可改變
StringBuffer:字串變數,執行緒安全,如果需要頻繁的對字串內容進行修改,處於效率考慮最好使用StringBuffer。StringBuffer,在任意時間點上都包含特定的字元序列,但通過方法呼叫改變長度和內容
StringBuilder:字串變數,非執行緒安全。StringBuilder物件被當做一個包含字元序列的變長陣列,是在JDK1.5後新增的,可用於字串緩衝區被單執行緒使用時使用
15、String物件的兩種建立方式
通過構造方法建立字串物件是在堆記憶體
直接賦值方式建立物件是方法區的常量池
16、String是基本的資料型別
String類是final型別,因此這個類不能被繼承,不能修改。為了提高效率節省空間,使用StringBuilder類
17、GC是什麼?為什麼要用GC
GC是垃圾回收的意思,記憶體處理是程式設計人員容易出現的問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,java提供的GC功能可以自動檢測物件是否超過作用域從而達到自動回收的目的,java語言沒有提供釋放已分配記憶體的顯示操作方法。
18、java中有幾種型別的流
位元組輸入流:InputStream 位元組輸出流:OutputStream
字元輸入流:Reader 字元輸出流:Writer
19、什麼是java序列化,如何實現java序列化
java物件的序列化是指將一個java物件寫入IO流中,於此對應的是,物件的反序列化則是從IO流中恢復的Java物件。如果要讓某個物件支援反序列化機制,必須讓它的類是可序列化,則需要實現Serializable介面或者Externalizable介面
20、物件在序列化時不想給一個欄位的資料儲存到硬碟上
使用transient關鍵字
21、IO中的介面卡模式
介面卡模式:講一個累的介面轉換成客戶希望的另一個介面,使得原本由於介面不相容而不能一起工作的哪些類可以一起工作在java IO中。
BufferedReaderbr = new BufferedReader(new InputStreamReader(is2,"utf8"));
(將位元組流介面,轉換成字元流介面)
br.readLine();
因為要逐行解析字串, 我們需要使用字元流,對檔案內容進行處理, 所以使用Reader輸入流下面的BufferedReader,BufferedReader並不能直接處理檔案,它需要傳入一個Reader型別的引數,Reader下面能處理檔案的類:InputStreamReader,以及其子類FileReader,這2個類都需要一個InputStream來讀取檔案中的內容並轉換, 這2個類其實就是介面卡, 可以把位元組流轉換成字元流, 然後使用Reader來解析其中的內容
22、IO中的裝飾模式
裝飾模式就是對一個類進行裝飾,增強其方法行為,在裝飾模式中,作為原來的這個類的使用者應該感受不到裝飾前和裝飾後的不同。裝飾模式就是對原有功能的擴充套件。
22、介面卡模式和裝飾模式的總結
介面卡模式主要是將一個介面轉變成另一個介面,它的目的是通過改變介面來達到重複使用的目的。裝飾模式則是不是改變被裝飾物件的介面,而是保持原來的介面,但是增強了元有物件的功能,或改變原有物件的方法而提高效能
23、同步和非同步、阻塞和非阻塞
同步:當一個同步呼叫發出後,呼叫者要一直等待返回訊息通知後,才能進行後續執行
非同步:當一個非同步過程呼叫發出後,呼叫者不能立刻得到返回訊息。在呼叫結束後,通過訊息回撥來通知呼叫者是否成功
阻塞:阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,一直處於等待訊息通知,不能夠執行其他業務,函式只有在得到結果後才會返回
非阻塞:非阻塞和阻塞的概念相對應,指再不能立刻得到借過錢,該函式不會阻塞當前執行緒,而會立刻返回
同步和非同步的重點在於訊息通知的方式,也就是呼叫結果通知的方式
阻塞和非阻塞的重點是當前執行緒等待訊息返回的行為
分類:同步阻塞、同步非阻塞、非同步阻塞、非同步非阻塞
24、程序和執行緒的區別
程序是正在進行中的程式。執行緒其實就是程序中一個程式執行控制單元,一條執行路徑。程序負責的是應用程式的空間的標示。
一個程序至少有一個執行緒在執行,當一個程序中出現多個執行緒時,這個應用程式就是多執行緒應用程式,每個執行緒在棧區都有自己的執行空間,自己的方法區、自己的變數。
25、執行緒的執行
start方法,作用1、啟動了執行緒,2)、讓jvm呼叫了run方法
26、建立執行緒的方式
1)、繼承Thread,由子類重寫run方法,由run方法體來完後曾執行緒需要做的事
2)、實現了Runnable介面,由run方法體來完後曾執行緒需要做的事
3)、通過Callable和FutrueTask建立執行緒。建立Callable的實現類,實現call()方法,該call()方法作為執行緒執行體,並有返回值
建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。
27、多執行緒安全問題
當一個執行緒執行多條語句時,並運算同一個資料時,在執行過程中,其他執行緒參與進來,並操作這個資料,導致了錯誤資料的產生
涉及到兩個因素
1、多個執行緒在操作共享資料
2、有多條資料對共享資料進行運算
解決方案:
只要將操作共享資料的語句在某一個時段讓一個執行緒執行完,在執行過程中,其他執行緒不能進來執行就可以解決--------使用同步程式碼塊
28、同步的好處與弊端
好處是解決了執行緒安全問題,弊端是相對降低效能,因為判斷鎖需要資源,產生了死鎖
前提:必須有兩個及以上的執行緒才需要同步,多個執行緒必須保證是同一個鎖
29、同步程式碼塊和同步函式的區別
同步程式碼塊使用的鎖可以是任意物件
同步函式使用的鎖是this,靜態同步函式的鎖是該類的位元組碼檔案物件
在一個類中只有一個同步,可以使用同步函式。如果有多同步,必須使用同步程式碼塊,來確定不同的鎖。同步程式碼塊相對靈活一些
30、請寫一個延遲載入的單例模式?寫懶漢式;當出現多執行緒訪問時怎麼解決?加同步,解決安全問題;效率高嗎?不高;怎樣解決?通過雙重判斷的形式解決。
//懶漢式:延遲載入方式。
當多執行緒訪問懶漢式時,因為懶漢式的方法內對共性資料進行多條語句的操作。所以容易出現執行緒安全問題。為了解決,加入同步機制,解決安全問題。但是卻帶來了效率降低。
為了效率問題,通過雙重判斷的形式解決。
class Single{
privatestatic Single s = null;
privateSingle(){}
publicstatic Single getInstance(){ //鎖是誰?位元組碼檔案物件;
if(s== null){
synchronized(Single.class){
if(s== null)
s= new Single();
}
}
returns;
}
}
31、等待喚醒機制
wait:將同步中的執行緒處於凍結狀態。釋放了執行權,釋放了資格,同時將執行緒物件存線上程池中
notify:喚醒執行緒池中的某一個等待執行緒
notifyAlll:喚醒的是執行緒池中的所有執行緒
32、sleep和wait的區別
wait:可以指定時間也可以不指定時間,不指定時間,只能由對應的notify或者notifyall來喚醒
sleep:必須指定時間,時間到自動從凍結狀態轉成執行狀態(臨時阻塞狀態)
wait:執行緒會釋放執行權,而且執行緒會釋放鎖
sleep:執行緒會釋放執行權,但不釋放鎖
33、執行緒死鎖的出現和解決辦法
當執行緒任務出現了多個同步(多個鎖)時,如果同步嵌套了其他的同步,這時容易引發一種現象:執行緒出現無限等待,都在等待對方的執行結束
解決方案:執行緒按照一定的順序加鎖,按照同一順序訪問物件,避免事務中使用者的互動,保持事務處於一個批處理,死鎖檢測
34、lock和synchronize的區別
lock不是java內建的,synchronize是java的關鍵字,lock是一個類,通過這個類可以實現同步訪問
Lock和Synchronize的最大不同:採用Synchronize不需要使用者去手動加鎖,當Synchronize方法或者程式碼塊執行完成後,系統會自動讓執行緒釋放對鎖的佔用,而lock則必須要使用者手動釋放鎖,如果沒有自動釋放鎖,會出現死鎖的現象
35、啟動一個執行緒是run()還是start()?它們的區別?
啟動一個執行緒是start()
區別:
start: 啟動執行緒,並呼叫執行緒中的run()方法
run : 執行該執行緒物件要執行的任務
36、單例設計模式
兩種方式
A:餓漢式:當類載入時就建立物件
class Student{
privateStudent(){}
private static final Student s = newStudent();
publicstatic Student getInstance(){
returns;
}
}
B:懶漢式 當使用的時候,才去建立物件
classStudent{
privateStudent(){}
privatestatic final Student s = null;
publicstatic Student getInstance(){
if(s==null){
//執行緒1進來了,執行緒2就進來了
s= new Student();
}
returns;
}
}
餓漢式和懶漢式的區別
餓漢式是類一載入就建立好物件,
懶漢式是類載入進記憶體,物件還沒有存在,只有呼叫getInstance()方法才建立物件
懶漢式是延遲載入,如果多個執行緒同時操作懶漢式就可以出現執行緒安全問題,
開發中常使用餓漢式,因為餓漢式安全。
37、Java中建立(例項化)物件的五種方式
1、用new語句建立物件,這是最常見的建立物件的方法。
2、通過工廠方法返回物件,如:String str = String.valueOf(23);
3、運用反射手段,呼叫java.lang.Class或者java.lang.reflect.Constructor類的newInstance() 例項方法。如:Object obj =Class.forName("java.lang.Object").newInstance();
4、呼叫物件的clone()方法。
5、通過I/O流(包括反序列化),如運用反序列化手段,呼叫java.io.ObjectInputStream 物件的 readObject()方法。
38、異常
程式執行過程中的不正常現象叫做異常
異常的根類是Throwable
|--Error:重大問題,處理不了,例如JVM記憶體溢位
|--Exception:一般性錯誤,需要我們編寫程式碼進行處理
39、異常的分類:
編譯時異常
在編譯時,如果沒有處理,編譯失敗
執行時異常
在編譯時,不需要處理,編譯器不檢查
該異常的發生,減一不處理,讓程式停止,需要對程式碼進行修正
40、java中三種常見記憶體溢位錯誤的處理方法
jvm管理的記憶體大致包括三種不同型別的記憶體區域:Permanent Generation space(永久儲存區域)、Heapspace(堆區域)、Java Stacks(Java棧)。
第一種OutOfMemoryError: PermGen space
原因是:程式中使用了大量的jar或class,使java虛擬機器裝載類的空間不夠
解決方案:
1、增加java虛擬機器中的XX:PermSize和XX:MaxPermSize引數的大小,其中 XX:PermSize是初始永久儲存區域大 小,XX:MaxPermSize是最大永久儲存區域大小。
2、清理應用程式中web-inf/lib下的jar,如果tomcat部署了多個應用,很多 應用都使用了相同的jar,可以將共同的jar移到tomcat共同的lib下,減少類的重 復載入。
第二種OutOfMemoryError: Java heap space
原因是java虛擬機器建立的物件太多,在進行垃圾回收之間,虛擬機器分配的到堆內 存空間已經用滿了,與Heapspace有關
解決方案:
1、檢查程式,看是否有死迴圈或不必要地重複建立大量物件。找到原因後,修改 程式和演算法。
2、增加Java虛擬機器中Xms(初始堆大小)和Xmx(最大堆大小)引數的大小。
第三種OutOfMemoryError:unable to create new native thread
因為JVM已經被系統分配了大量的記憶體,並且它至少要佔用可用記憶體的一半
要想建立更多的執行緒,你必須減少分配給JVM的最大記憶體
41、final、finally、finalize區別
final是最終的意思,可以用於修飾類、成員變數、成員方法
它修飾的類不能被繼承,修飾的變數是常量,修飾方法不能被重寫
finally:是一場處理裡面的關鍵字
它其中的程式碼永遠會被執行,特殊情況:在執行前jvm退出
finalize是Object類中的一個方法
它用於垃圾回收器呼叫方式
42、什麼是鎖?鎖的作用是什麼?
鎖就是物件
鎖的作用是保證執行緒同步,解決執行緒安全問題。
持有鎖的執行緒可以在同步中執行,沒有鎖的執行緒即使獲得cpu執行權,也進不去。
43、什麼是ThreadLocal類,怎麼使用它?
ThreadLocal類提供了執行緒區域性 (thread-local) 變數。是一個執行緒級別的區域性變數,並非“本地執行緒”。
ThreadLocal為每個使用該變數的執行緒,提供了一個獨立的變數副本,每個執行緒修改副本時不影響其它執行緒物件的副本
下面是執行緒區域性變數(ThreadLocal variables)的關鍵點:
一個執行緒區域性變數(ThreadLocal variables)為每個執行緒方便地提供了一個單獨的變數。
ThreadLocal例項通常作為靜態的私有的(private static)欄位出現在一個類中,這個類用來關聯一個執行緒。
當多個執行緒訪問 ThreadLocal 例項時,每個執行緒維護 ThreadLocal 提供的獨立的變數副本。
常用的使用可在 DAO 模式中見到,當 DAO 類作為一個單例類時,
資料庫連結(connection)被每一個執行緒獨立的維護,互不影響。(基於執行緒的單例)
44、集合和陣列的區別
陣列的長度是固定的,而集合長度是可變的
陣列值可以儲存物件,還可以儲存基本資料型別;而集合只能夠只能儲存物件
陣列儲存的資料型別是固定的,而集合儲存的資料型別不固定
45、HashSet是如何保證元素唯一性的呢?
如果兩元素的hashCode值不同,則不會呼叫equals方法
如果兩元素的hashCode值相同,則繼續判斷equals是否返回true;
hashCode和equals方法雖然定義在自定義物件類裡面,但不是我們手動呼叫而是往 HashSet集合裡面儲存元素的時候,集合底層自己呼叫hashCode和equals它自己 拿物件去判斷,自己判斷兩元素是否是同一個元素。
46、Map
Map:頂層介面,該集合儲存的是鍵值對,而且鍵是唯一的,Map和Set很像,Set集合底層就 是使用了Map集合。
Map集合沒有迭代器,要取出元素必須先將Map集合轉換成Set集合才能遍歷元素
|--->HashTable(JDK1.0):
底層是雜湊表資料結構;
不可以使用null鍵和null值;
用作鍵的物件必須實現hashCode和equals方法來保證鍵的唯一性
執行緒同步,效率低
|--->HashMap(JDK1.2):
底層是雜湊表資料結構;
允許使用null鍵和null值;
執行緒不同步,效率高;
保證元素唯一性的:
原理:先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是 否為true
(往HashSet裡面存的自定義元素要複寫hashCode和equals方法,以保證元素的 唯一性!)
47、LisIterator、Comparable、Comparator、Collections和Arrays
LisIterator:系列表迭代器,允許程式設計師按任一方向遍歷列表、迭代期間修改列表 Comparable:此介面強行對實現它每個類的物件進行整體自然排序。使元素具備比較性
Comparator:強行對某個物件collection進行整體排序的比較函式,使集合具備比較性
Collections:此類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。
Arrays:此類包含用來運算元組(比如排序和搜尋)的各種靜態方法
48、Map集合和Collection集合的區別?
(1)
Map中一次儲存是鍵值對。
Collection中一次儲存是單個元素。
(2)
Map的儲存使用的put方法。
Collection儲存使用的是add方法。
(3)
Map集合沒有迭代器,Map的取出,是將Map轉成Set,在使用迭代器取出。
Collection取出,使用就是迭代器。
(4)
如果物件很多,必須使用集合儲存。
如果元素存在著對映關係,可以優先考慮使用Map儲存或者用陣列,
如果沒有對映關係,可以使用Collection儲存。
49、IO流常用基類方法摘要:
**位元組寫入流:OutputStream:
voidclose() 關閉此輸出流並釋放與此流有關的所有系統資源。
voidflush()重新整理此輸出流並強制寫出所有緩衝的輸出位元組。
abstract void write(int b) 將指定的位元組寫入此輸出流。
voidwrite(byte[] b) 將 b.length 個位元組從指定的 byte陣列寫入此輸出流。
voidwrite(byte[] b, int off, int len)
將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此輸出流。
**位元組讀取流:InputStream:
voidclose() 關閉此輸入流並釋放與該流關聯的所有系統資源。
intavailable() (特有方法!!)
返回此輸入流下一個方法呼叫可以不受阻塞地從此輸入流讀取(或跳過) 的估計位元組數。
abstract int read() 從輸入流中讀取資料的下一個位元組。
intread(byte[] b)從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列 b中。
intread(byte[] b, int off, int len) 將輸入流中最多len個數據位元組讀入byte陣列。
longskip(long n) 跳過和丟棄此輸入流中資料的 n 個位元組。
**字元寫入流:Writer:
abstract void close() 關閉此流,但要先重新整理它。
abstract void flush() 重新整理該流的緩衝。
voidwrite(int c) 寫入單個字元。
voidwrite(char[] cbuf) 寫入字元陣列。
abstract void write(char[] cbuf, int off, int len) 寫入字元陣列的某一部分。
voidwrite(String str) 寫入字串。
voidwrite(String str, int off, int len) 寫入字串的某一部分。
**字元讀取流:Reader:
abstract void close() 關閉該流並釋放與之關聯的所有資源。
intread() 讀取單個字元。
intread(char[] cbuf) 將字元讀入陣列
abstract int read(char[] cbuf, int off, int len) 將字元讀入陣列的某一部分。
longskip(long n) 跳過字元。
50、流的操作流程
(1)第一步:先明確源和目的
源:
文字:用Reader
位元組:用InputStream
目的:
文字:用Writer
位元組:用OutputStream
(2)第二步:明確是不是純文字
是:用字元流;
不是:用位元組流
(3)第三步:明確流體系後,通過裝置來明確具體使用哪個流物件
源裝置:
鍵盤:System.in
硬碟:檔案流File
記憶體:陣列流ArrayStream
目的裝置:
鍵盤:System.out
硬碟:檔案流File
記憶體:陣列流ArrayStream
51、File類常見需求:
(1)檔名過濾:列出給定目錄的所有.java檔案
publicvoid showFileName(File file)
{
String[]filenames = file.list(new FilenameFilter()//匿名內部類
{
publicboolean accept(File dir,String name)//複寫唯一方法
{
returnname.endsWith(".java");//列出所有.java檔案
}
});
}
(2)列出指定目錄下的所有檔案和資料夾(遞迴)
**示例1:不帶層次遞迴:
publicstatic void showDir(File dir)
{
File[]files = dir.listFile();
for(inti = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
showDir(files[i]);
else
sop(files[i]);
}
}
**示例2:帶層次遞迴:
publicstatic void showDir(File dir,int level)
{
sop(getLevel(level)+C);//進來先列印層次和目錄
level++;
File[]files = dir.listFile();
for(inti = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
showDir(files[i]);
else
sop(getLevel(level)+files[i]);//是檔案就列印層次和目錄
}
}
publicstatic String getLevel(int level)
{
sop("|--");
StringBuildersb = new StringBuilder();
for(inti=0;i<level;i++)
{
sb.inset(0."| ")
}
returnsb.toString();
}
(3)需求:刪除帶內容的目錄:
publicstatic void removeDir(File dir)
{
File[]files = file.listFile();
for(inti = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
removeDir(files[i]);//如果是資料夾則繼續呼叫函式
else//如果是檔案則刪除。注意刪除的時候列印刪除的結果,防止誤刪或者重刪的情況
sop(files[i].toString()+"::"+files[i].delete());
}
sop(dir+"::"+dir.delete());
}
(4)需求:將制定目錄下java檔案的絕對路徑儲存到文字檔案中。
思路:
**對指定目錄進行遞迴
**獲取遞迴過程中所有java檔案的路徑
**將這些路徑儲存到集合中
**將集合中的資料寫入檔案中
//對指定目錄進行遞歸併將所以Java檔案儲存到集合中
publicstatic void getFileName(File file,ArrayList<File> arraylist){
File[]files = file.listFiles();
for(int i = 0; i < files.length; i++) {
if(files[i].isDirectory()&&!files[i].isHidden()){
getFileName(files[i],arraylist);
}else{
if(files[i].getName().endsWith(".java")){
arraylist.add(files[i]);
}
}
}
}
//將集合中所有資料儲存到新檔案中
publicstatic void saveFileToNewDir(ArrayList<File> arraylist,File newDir){
BufferedWriterbufw = null;
try{
bufw= new BufferedWriter(new FileWriter(newDir));
for(File file : arraylist) {
StringfileAbsolutePath = file.getAbsolutePath();
bufw.write(fileAbsolutePath);
bufw.newLine();
bufw.flush();
}
}catch (Exception e) {
System.out.println("檔案寫入失敗");
}finally{
try{
if(bufw!=null)
bufw.close();
}catch (Exception e2) {
System.out.println("檔案寫入流關閉失敗");
}
}
}
52、Properties
(1)Properties是HashTable的子類,具備Map集合的特點,裡面儲存的是鍵值對
(2)Properties是IO流合集合相結合的集合容器
(3)Properties的特點是可以用於儲存鍵值對形式的配置檔案
53、網路模型:
OSI模型
應用層、表示層、會話層、傳輸層、網路層、資料連線層、物理層
TCP/IP模型
應用層、傳輸層、網際層、主機至網路層
54、UDP和TCP的區別:
UDP
將資料及源和目的封裝成資料包中,不需要建立連線
每個資料報的大小在限制在64k內
因無連線,是不可靠協議
不需要建立連線,速度快
TCP
建立連線,形成傳輸資料的通道。
在連線中進行大資料量傳輸
通過三次握手完成連線,是可靠協議
必須建立連線,效率會稍低
55、XML文件的定義形式?他們之間的本質區別,解析XML文件的方式
XMl文件定義分為DTD和Schema兩種形式,二者都是對XML語法的約束,其本質的區別在於Schema本省就是一個xml檔案,可以被XML解析器解析,而且樂意為XML承載的資料定義型別約束比DTD更強大。
對XML的解析主要有DOM(文件物件模型),SAX和StAX。
DOM處理大型檔案時其效能下降的非常厲害,這個問題是由DOM樹結構佔用的記憶體較多造成的,而且DOM解析方式必須在解析檔案之前把整個文件裝入記憶體,適合對XML的隨機訪問(典型的用空間換取時間的策略);SAX是事件驅動型的XML解析方式,它順序讀取XML檔案,不需要一次全部裝載整個檔案。當遇到像檔案開頭,文件結束,或者標籤開頭與標籤結束時
56、你在專案中哪些地方用到了XML?
XML的主要作用有兩個方面:資料交換和資訊配置。在做資料交換時,XML將資料用標籤組裝成起來,然後壓縮打包加密後通過網路傳送給接收者,接收解密與解壓縮後再從XML檔案中還原相關資訊進行處理,XML曾經是異構系統間交換資料的事實標準,但此項功能幾乎已經被JSON(JavaScriptObjectNotation)取而代之。