JAVA初級工程師面試36問(一)

      前幾天,一個老家的弟弟正在找java初級開發工程師的崗位,問我一般會問什麼問題? 第一時間聽到這個,我在想:what? 除了剛開始找工作的第一年面試幾家公司問了一些基礎項東西,後面兩家公司基本都是內推進去的,問的問題也是偏項目,偏實際,理論大概也沒有問什麼,當然,作爲一個愛回答問題的我,是肯定要給他指明方向的,於是 ,我便綜合各方面給他說了一些東西,同時記錄下來,萬變不離其宗.基礎知識是學習一個新東西和昇華一個東西必不可少的條件.

     第一問:    請說一下String和StringBuffer、StringBuilder的區別是什麼?

     線程安全性: 

             String中的對象是不可變,線程安全 

             StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。

             StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。

     性能: 

        String 類型進行改變的時候,都會生成一個新的String對象,然後將指針指向新的String 對象。

        StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象並改變對象引用。

        StirngBuilder 相比使用StringBuffer 僅能獲得10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

對於三者使用的總結:

  • 如果要操作少量的數據用 = String
  • 單線程操作字符串緩衝區 下操作大量數據 = StringBuilder
  • 多線程操作字符串緩衝區 下操作大量數據 = StringBuffer

 

 

第二問:Java的堆、棧、方法區(也叫常量池)理解?

         堆: 1.存放new出來的東西(對象、數組等) 2.可以被所有的線程共享,不會存放別的對象的引用.

         棧: 1.存放基本變量(會包含這個基本類型的具體數值) 2.引用對象的變量(會存放這個引用在堆裏面的具體地址)

  方法區: 1.可以被所有的線程共享 2.包含了所有的class和static變量.

第三問:Java中的==和toString方法和equals方法的區別?

 

   == :  用來判斷兩個變量是否相等,1.如果是基本類型,則只要值相等,判斷的結果就是true. 2.如果是比較的引用類型,那麼只有在兩個變量指向的是同一對象時纔是true

 equals: 默認情況下內部就是==比較,所以如果不重寫的話,比較結果和==比較一樣,在String中已經重寫了equals方法.

toString : 該方法屬於Object,Object是所有類的頂級父類,都繼承了toString方法,在實際使用的時候需要重寫toString方法然後實現內容的直接輸出.

 

 

第四問: ArrayList和LinkedList的區別?

  1. List是一個接口,他繼承Collection接口,代表有序的隊列。
  2. ArrayList、LinkedList是是List的實現類.
  3. ArrayList是實現了基於動態數組的數據結構,而LinkedList是基於鏈表的數據結構
  4. 對於隨機訪問的get和set,ArrayList要優於LinkedList,因爲LinkedList基於指針的移動
  5. 對於添加和刪除操作add和remove,一般LinkedList要比ArrayList快,因爲ArrayList要移動數據。(其實真正大數據量化還是不太對的)
  6. 當添加數據量很小時,兩者區別不太大,當添加的數據量大時,大約在容量的1/10之前,LinkedList會優於ArrayList,在其後就劣與ArrayList,且越靠近後面越差。所以個人覺得,一般首選用ArrayList,由於LinkedList可以實現棧、隊列以及雙端隊列等數據結構,所以當特定需要時候,使用LinkedList,當然咯,數據量小的時候,兩者差不多,視具體情況去選擇使用;當數據量大的時候,如果只需要在靠前的部分插入或刪除數據,那也可以選用LinkedList,反之選擇ArrayList反而效率更高。

 

第五問: 簡單介紹下你對Http協議與TCP協議簡單理解?

       1.Tcp協議對應着傳輸層,而HTTP協議對應着應用層;

       2.從本質上而言,他們之間是沒有區別的,因爲http協議是建立在TCP協議之上的,比如,當我們發送一個http的請求,那麼http就會通過tcp來建立一個連接到服務的一個通道,Http會立即將TCP斷開,因此我們也說http是一種短連接或者無狀態連接。

       3.所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,服務器進程中就能保持這個連接並且在內存中記住一些信息狀態,而每次請求結束後,連接就關閉,相關的內容就釋放了,所以記不住狀態,成爲了無狀態連接。

      4.隨着前端html頁面功能的增強,如果我們每次訪問一個頁面都要建立一個TCP的連接,那效率就慢了,從HTTP/1.1開始,默認都開啓了Keep-Alive,保持連接性,也就是說當一個網頁打開完成後,http數據的tcp連接不會再關閉了,會有一個保持的時間,但是這個時間一到也會自動關閉。

      5.之所以http是短連接,tcp是長連接。因爲,http每次請求完後就會關閉,而通過socket編程使用TCP協議的時候,控制開關閉的代碼在我們手上,我們只要不關閉就會讓連接狀態一直保持着。

第六問: java中爲啥內部類可以訪問外部類的成員?

1 編譯器自動爲內部類添加一個成員變量, 這個成員變量的類型和外部類的類型相同, 這個成員變量就是指向外部類對象的引用;

2 編譯器自動爲內部類的構造方法添加一個參數, 參數的類型是外部類的類型, 在構造方法內部使用這個參數爲1中添加的成員變量賦值;

3 在調用內部類的構造函數初始化內部類對象時, 會默認傳入外部類的引用.

 未完待續....

 

 

 

 

 

    

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章