1. 程式人生 > >面試題 ------ 基礎篇

面試題 ------ 基礎篇

1、面試流程

1、簡單的自我介紹
    我是xxx,工作xxx年,我現在在xxx公司,先後做過xxx個專案,yyy專案。
2、你簡單介紹一下xxx專案。為了解決xxx問題,開發了一套xxx系統,該系統主要有哪些部分組成。簡單介紹專案的整體架構。參與某個模組得開發。就要求你說一下這個模組得業務及設計。
3、會問一下Java 的專業技能
4、你還有什麼需要詢問我的嗎?
    公司要做專案?專案中會使用一下什麼技術/

經歷多輪面試後,對於你的自我介紹和專案、專案經驗面試官就不太關心了。
    你說一下你最擅長的是什麼?你簡單說一下?

最終技術面試完成後,都會讓你回家等訊息。或者等 Hr 來和你談薪資和福利。

2、Java 得跨平臺原理

    Java 通過不同的系統、不同版本、不同位數的Java 虛擬機器(jvm)、來遮蔽不同的系統的指令集差異而對
外體統一介面(Java API),對於我們不同的Java 的開發語言而言,只需要按照介面開發即可,如果我係統需要
部署到不同的開發環境時,只需在系統上面按照對應版本得虛擬機器即可。

3、搭建一個java的開發環境

1、適用於我們開發環境的jdk
2、對應開發環境 eclipse
3、還需要 web 伺服器(tomcat)

下載對應元件
安裝
    jdk 安裝正常流程安裝即可,配置我們得 JAVA_HOME, 因為後面 eclipse 和 tomcat 會依賴這個變數
    Eclipse 正常解壓就 ok,設定 workspace 的預設編碼
    Tomcat 正常解壓就 ok,把 tomcat 整合到 eclipse 中,安裝外掛就 ok
     Svn/git

3、java中int佔幾個位元組

java 中有幾種基本資料型別?8種

1、整型
型別            儲存需求        bit數        取值範圍            備註
int              4位元組          4*8            
short            2位元組          2*8        -32768~32767
long             8位元組          8*8        
byte             1位元組          1*8         -128~127

2、浮點型
型別            儲存需求        bit數        取值範圍            備註
float            4位元組          4*8                            float 型別的數值字尾F(例如:3.14F)
double           8位元組          8*8                            沒有後綴F的浮點數(如3.14)預設為double型別

3、char 型別
型別            儲存需求        bit數        取值範圍            備註
char             2位元組          2*8

4、boolean 型別
型別            儲存需求        bit數        取值範圍            備註
boolean          1位元組          1*8         false,true


int 佔 4個位元組,32 位
bollean 1位

 

5、java面向物件的特徵

有四大基本特徵:封裝、繼承、多型、抽象

    1、封裝:即將物件封裝成一個高度自治和相對封閉的個體,物件狀態(屬性)由這個物件自己的行為(方法)來讀取和改變。
    2、抽象:找出一些事物的相似和共性之處,然後將這些事物歸為一類,這個類只能考慮這些事的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關方面。就是把現實生活中的物件,抽象為類。
    3、繼承:定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義得內部作為自己的內容,並且加入若干新的內容,或修改原來的方法使之更適合特殊的需要。
    4、多型:是指程式定義得引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件。該引用變數發出的方法呼叫到底是哪個類的實現的方法,必須在由程式執行期間才能決定。                          
    靠的是父類或介面定義得引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是引用變數所指向的具體例項物件的方法,也就是記憶體里正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。

6、有了基本資料型別,為什麼還需要包裝型別

基本資料型別。java 中提供了 8 中基本的資料型別。boolean int float 等
包裝型別:每一個得資料型別都會一一對應一個包裝型別
boolean ---> Boolean
int -----> Integer

裝箱和拆箱

裝箱:把基本的資料型別轉換成對應的包裝型別.
Integer i = 1;   自動裝箱:實際上在編譯時會呼叫 Integer.valueOf 方法來裝箱

拆箱:把包裝型別轉換為基本資料型別,基本資料型別    名稱 = 對應的包裝型別。
int j = i;   自動拆箱:編譯時會呼叫   i.intValue();

Java 是一個面向物件的語言,而基本的資料型別,不具備面向物件的特性。
null Integer ----> null int ----> 用Integer 和 int 分別表示 Person 這個類的Id 
Max 最大值
Min  最小值
快取值:物件快取, Integer i = 1;  Integer j = 1;  i==j;

7、說一下“==” 和 equals 方法究竟有什麼區別?

== 用來判斷兩個變數之間的值是否相等、變數就可以分為基本資料型別變數,引用型別。如果是基本資料型別的變數直接比較值而引用型別要比較對應的引用的記憶體的首地址。

equals 用來比較兩個物件長得是否一樣,判斷兩個物件的某些特徵是否一樣。實際上就是呼叫物件的 equals 方法進行比較。

8、String 和StringBuilder 的區別(final)?StringBuffer 和 StringBuilder 的區別?

在java 中提供三個類String、StringBuilder、StringBuffer 來表示和操作字串。字串就是多個字元的集合。

String 是內容不可變的字串。String 底層使用了一個不可變字串陣列(final char[])
String str = new String("bbb");

而StringBuffer、StringBuilder 是內容可以改變的字串。
StringBuilder、StringBuffer 底層使用得可變的陣列(沒有使用final 修飾)

最經典就是拼接字串
1、Stirng 進行拼接,String c = "a" + "b";
2、StringBuilder 或者 StringBuffer StringBuffer sb = new StringBuffer();
   sb.append("b").append("a");


StringBuilder 是執行緒不安全的,效率高。
StirngBuffer 是執行緒安全的,效率低。

9、Java 中的集合

Java 中的集合分為value(Conllection), key-value(Map)兩種
儲存值分為 List 和 Set:
    List 是有序的,可以重複的。
    Set 是無序的,不可重複的。(根據equals 和 hashcode 判斷,也就是如果一個物件要儲存在Set 中,必須重寫 equals 和 hashCode 方法)
儲存key-value 的為map:
    

10、ArrayList 和 LinkeList 的區別 和 使用場景?

ArrayList 底層使用得是陣列。LinkList 使用的是連結串列。
    陣列查詢具有索引查詢特定元素比較快。而插入和刪除和修改比較慢(陣列在記憶體中是一塊連續的記憶體。如果插入和刪除是需要移動位置)。
    連結串列不要求記憶體是連續的,在當前元素中存放下一個或上一個元素的地址。查詢時需要從頭部開始,一個一個的找。所以查詢效率低。插入時不需要移動記憶體,只需改變引用指向即可。所以插入或刪除效率高。

ArrayList 使用在查詢比較多,但是插入和刪除比較少的情況,而LinkedList 使用在查詢比較少而插入和刪除比較多的情況

11、HashMap 和 HashTable 的區別?HashMap 和 ConcurrentHashMap 的區別?

相同點:HashMap 和 HashTable 都可以使用來儲存 key-value 的資料。
區別:
1、HashMap 是可以把null 作為key 或者value的,而 HashTable 是不可以的。
2、HashMap 是執行緒不安全的,效率較高。而HashTable 是執行緒安全的,效率較低。


通過把整個Map 分為N 個 Segment (類似 HashTable),可以提供相同的執行緒安全,但是效率提升N 倍,預設提升16倍。

12、實現一個拷貝檔案類使用位元組流還是字元流?

我們拷貝的檔案不確定是隻能包含字元流,有可以能有位元組流(圖片、聲音、影象)。為了考慮到通用性,要使用位元組流。

13、講一下執行緒的幾種實現方式?

1、通過繼承 Thread 類實現一個執行緒
2、通過實現 Running 介面實現一個執行緒

繼承擴充套件性不強,java 只支援單繼承,如果一個類繼承 Thread 就不能繼承其他類了。

1)怎麼啟動?
    Thread thread = new Thread(繼承了 Thread的物件/實現了 Running物件);
    thread.setName("設定一個執行緒名稱");
    thread.start();
    啟動執行緒使用 start 方法,而啟動以後執行的是 run 方法
2)怎麼區分?在一個系統中有很多執行緒,每個執行緒都會列印日誌,我想區分是那個執行緒列印?
    thread.setName("設定一個執行緒名稱"); 這是一種規範,線上程完成後,都需要設定名稱

14、執行緒並法庫和執行緒池的作用?

JDK5 中增加了 Doug Lea的並法庫,這一引進給Java 執行緒的管理和使用提供了強大的便利性。java.util.current 包中提供了對執行緒優化。管理的各項操作,使得執行緒的使用變得心應手。該包提供了執行緒的執行,執行緒池的建立,執行緒生命週期的控制。

Java 通過Executors 提供四種靜態方法建立執行緒池。分別為:
    newCachedThreadPool 建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒。若無可回收,則新建執行緒。
    newFixedTreadPool 建立一個定長的執行緒池,可控制執行緒最大併發數,超過的執行緒會在佇列中等待。
    newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行
    newSingleThreadPoolExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先順序)執行

執行緒池的作用?
    1、限定執行緒的個數,不會導致由於導致執行緒過多導致系統執行緩慢或崩潰。
    2、執行緒池不需要每次都去建立或銷燬,節約了資源。
    3、執行緒池不需要每次都去建立,響應時間更快。
    連線池也是一樣?

15、設計模式和常用的設計模式?

設計模式:經過前人無數次的實踐總結出,設計過程中可以反覆使用的、可以解決特定問題的設計方法。

單例模式:餓漢式(靜態常量)、餓漢式(靜態程式碼塊)、懶漢式(執行緒不安全)、懶漢式(執行緒安全,同步方法)、懶漢式(執行緒安全,同步程式碼塊)、雙重檢查、靜態內部類、列舉
    1、構造方法私有化,讓出了自己類中能建立外其他地方都不能建立
    2、在自己的類中建立一個單例項
    3、提供一個方法獲取該例項物件

工廠模式:Spring IOC 就是使用了工廠模式。
        物件的建立交給一個工廠去建立。
代理模式:Spring AOP 就是使用的動態代理。