1. 程式人生 > >java面試(基礎篇)

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)取而代之。